不少手機或者手機助手都會有攔截APP權限的功能,若是權限被攔截,就不能正常獲取到須要的信息。不過系統對權限的控制其實並不完美,仍是有方法能夠繞過的。這裏以藍牙mac地址作爲示例,分享一種繞過系統權限控制的方法。java
String getBluetoothAddress(){ String blueMac=""; BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter != null) { blueMac = mBluetoothAdapter.getAddress(); } return blueMac; }
不過這個方法須要權限android
<uses-permission android:name="android.permission.BLUETOOTH" />
4.2之後的Android源碼,新增了BluetoothManagerService.java,裏面這樣的實現sql
private static final String SECURE_SETTINGS_BLUETOOTH_ADDR_VALID="bluetooth_addr_valid"; private static final String SECURE_SETTINGS_BLUETOOTH_ADDRESS="bluetooth_address"; private static final String SECURE_SETTINGS_BLUETOOTH_NAME="bluetooth_name"; /** * Save the Bluetooth name and address in the persistent store. * Only non-null values will be saved. * @param name * @param address */ private void storeNameAndAddress(String name, String address) { if (name != null) { Settings.Secure.putString(mContentResolver, SECURE_SETTINGS_BLUETOOTH_NAME, name); mName = name; if (DBG) Log.d(TAG,"Stored Bluetooth name: " + Settings.Secure.getString(mContentResolver,SECURE_SETTINGS_BLUETOOTH_NAME)); } if (address != null) { Settings.Secure.putString(mContentResolver, SECURE_SETTINGS_BLUETOOTH_ADDRESS, address); mAddress=address; if (DBG) Log.d(TAG,"Stored Bluetoothaddress: " + Settings.Secure.getString(mContentResolver,SECURE_SETTINGS_BLUETOOTH_ADDRESS)); } if ((name != null) && (address != null)) { Settings.Secure.putInt(mContentResolver, SECURE_SETTINGS_BLUETOOTH_ADDR_VALID, 1); } }
會在/data/data/com.android.providers.settings/databases/settings.db數據庫裏增長bluetooth_address,保存藍牙mac地址數據庫
數據庫內容截圖以下所示:ide
不過sdk裏,並無提供這樣的接口去獲取這個值,不過AndroidID也是保存在這個sqlite裏的,使用相似的調用方法就能夠獲取這個值spa
String bluetoothAddress = Settings.Secure.getString(getContentResolver(), "bluetooth_address");
看完了雲捕技術人員提供的方法, 是否是以爲茅塞頓開呢!code