之前寫了一篇關(guān)于系統(tǒng)應(yīng)用實現(xiàn)一次貼片多次讀卡的文章,實際運用過程中發(fā)現(xiàn)了一些小問題吻育,某些設(shè)備(android 8.0可以,android7.0不可以)在線程中反射調(diào)用系統(tǒng)api時有時會不成功冕臭,導(dǎo)致之后設(shè)備讀得了卡余蟹,但是我的應(yīng)用收不到卷胯,不走onNewIntent,嘗試4.4以上的新方法enableReaderMode()也不返回NfcAdapter.ReaderCallback的onTagDiscovered回調(diào)威酒。
莫得辦法诵竭,又不能刪庫跑路,只能另尋他路兼搏,在擺弄著我的設(shè)備時,忽然發(fā)現(xiàn)了一個有趣的現(xiàn)象沙郭,當(dāng)我熄屏再亮屏的時候佛呻,我的app居然又收到了標簽信息。
實現(xiàn)思路:通過控制屏幕的亮滅來實現(xiàn)一次貼卡多次讀卡
網(wǎng)上很多說用PowerManager和PowerManager.WakeLock來實現(xiàn)亮滅病线,根本就不行吓著,還需要設(shè)備管理員權(quán)限才可以鲤嫡。
具體如下:
1.添加權(quán)限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
2.添加Receiver:
< android:name=".newfunction.nfc.receiver.ScreenOffAdminReceiver"
? ? android:label="@string/app_name"
? ? android:permission="android.permission.BIND_DEVICE_ADMIN">
? ? ? ? android:name="android.app.device_admin"
? ? ? ? android:resource="@xml/device_admin" />
? ? ? ? <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</receiver>
3.Receiver的實現(xiàn):
public class ScreenOffAdminReceiver extends DeviceAdminReceiver {
}
4.需要的xml包下device_admin.xml:
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<!-- 強行鎖定 在里僅這個是需要的-->
<force-lock />
</uses-policies>
</device-admin>
5.activity中初始化參數(shù)
private DevicePolicyManager policyManager;
private ComponentName adminReceiver;
private PowerManager mPowerManager;
private PowerManager.WakeLock mWakeLock;
private void initParams() {
adminReceiver =new ComponentName(this, ScreenOffAdminReceiver.class);
? ? mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);
? ? policyManager = (DevicePolicyManager)this.getSystemService(Context.DEVICE_POLICY_SERVICE);
}
6.檢測是否有權(quán)限的方法以及亮滅屏
/**
* @param view 亮屏
*/
public void checkScreenOn(View view) {
mWakeLock =mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
? ? mWakeLock.acquire();
? ? mWakeLock.release();
}
/**
* @param view 熄屏
*/
public void checkScreenOff(View view) {
boolean admin =policyManager.isAdminActive(adminReceiver);
? ? if (admin) {
policyManager.lockNow();
? ? }else {
showToast("沒有設(shè)備管理權(quán)限");
? ? }
}
/**
* @param view 檢測并去激活設(shè)備管理器權(quán)限
*/
public void checkAndTurnOnDeviceManager(View view) {
Intent intent =new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
? ? intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, adminReceiver);
? ? intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "開啟后就可以使用鎖屏功能了...");//顯示位置見圖二
? ? startActivityForResult(intent, 0);
}
private boolean isOpen() {
if (policyManager.isAdminActive(adminReceiver)) {//判斷超級管理員是否激活
? ? ? ? return true;
? ? }else {
return false;
? ? }
}
//用戶激活設(shè)備管理權(quán)限的回調(diào)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
? ? if (isOpen())
showToast("設(shè)備已被激活");
else
? ? ? ? showToast("設(shè)備沒有被激活");
}
private void showToast(String Str) {
Toast.makeText(this, Str, Toast.LENGTH_SHORT).show();
}
7.使用
while (isNfcTestStart) {
checkScreenOn(null);//亮屏
//業(yè)務(wù)邏輯
checkScreenOff(null);//熄屏
}
這樣就實現(xiàn)了一次讀卡終生讀取了,更好的實現(xiàn)目前還沒找到绑莺,有知道的大佬評論區(qū)或者私信我暖眼,一起探討探討。
手打不易纺裁,點個贊唄诫肠。
亮滅屏參考文章:
https://blog.csdn.net/u011913612/article/details/77822280