應(yīng)用場景
很多手機或者手機助手都會有攔截APP權(quán)限的功能而克,如果權(quán)限被攔截,就不能正常獲取到需要的信息怔毛。不過系統(tǒng)對權(quán)限的控制其實并不完美员萍,還是有方法可以繞過的。這里以藍牙m(xù)ac地址做為示例拣度,分享一種繞過系統(tǒng)權(quán)限控制的方法碎绎。
常用的獲取bluetooth mac代碼如下:
String getBluetoothAddress(){
String blueMac="";
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter != null)
{
blueMac = mBluetoothAdapter.getAddress();
}
return blueMac;
}
不過這個方法需要權(quán)限
4.2以后的Android源碼,新增了BluetoothManagerService.java抗果,里面這樣的實現(xiàn)
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數(shù)據(jù)庫里增加bluetooth_address,保存藍牙m(xù)ac地址
數(shù)據(jù)庫內(nèi)容截圖如下所示:
不過sdk里筋帖,并沒有提供這樣的接口去獲取這個值,不過AndroidID也是保存在這個sqlite里的冤馏,使用類似的調(diào)用方法就可以獲取這個值
String bluetoothAddress = Settings.Secure.getString(getContentResolver(), "bluetooth_address");
這個方法的優(yōu)點是不需要權(quán)限日麸,缺點是只有4.2之后的系統(tǒng)才可使用此方法
6.0以后的系統(tǒng),已經(jīng)不再能獲取到藍牙地址