在BluetoothGattCallback中使用Content Provider时的安全问题



当onCharacteristicChanged()回调被调用时,我观察到一个奇怪的权限相关问题。

我正在编写一个Android服务,它使用蓝牙LE api与外围角色中的LE(低能量)传感器通信。我在传感器通知任何变化的特性上启用通知。

当onCharacteristicChanged()回调被调用时,我的服务检索特征值并将其存储在一个内容提供程序中。对此内容提供程序的访问受签名级别权限的限制。托管我的服务的应用程序具有这些权限。

下面是onCharacteristicChanged的简化代码:
@Override
public void onCharacteristicChanged(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic) {
    super.onCharacteristicChanged(gatt, characteristic);
    Log.v(TAG, "pid=" + android.os.Process.myPid() + " uid=" + android.os.Process.myUid());
    Uri uri = mContext.getContentResolver().insert(URI_VALUES, characteristic.getValue());
}

在上面的回调中调用insert() api时,我获得了安全权限。

02-27 15:15:32.752: V/ProxyGattClient(10511): pid=10511 uid=10177
02-27 15:15:32.792: E/PersistenceUtil(10511): Error saving a reading into the database
02-27 15:15:32.792: E/PersistenceUtil(10511): java.lang.SecurityException: Permission Denial: writing com.example.content.MyContentProvider uri content://com.example/values from pid=1336, uid=1002 requires com.example.permission.ACCESS_CONTENT, or grantUriPermission()
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.content.ContentProvider$Transport.enforceWritePermissionInner(ContentProvider.java:445)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.content.ContentProvider$Transport.enforceWritePermission(ContentProvider.java:382)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.content.ContentProvider$Transport.insert(ContentProvider.java:210)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.content.ContentResolver.insert(ContentResolver.java:917)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at com.qcl.vh.ble.ProxyGattClient.onCharacteristicChanged(ProxyGattClient.java:101)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.bluetooth.BluetoothGatt$1.onNotify(BluetoothGatt.java:425)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:397)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at android.os.Binder.execTransact(Binder.java:388)
02-27 15:15:32.792: E/PersistenceUtil(10511):   at dalvik.system.NativeStart.run(Native Method)

运行'adb shell ps'显示pid=1336, uid=1002是"com.android "的进程id。蓝牙"过程。上面的堆栈跟踪显示,内容提供程序的插入在蓝牙进程的上下文中被调用。当然,这个进程没有权限写入内容提供程序,因此这个例外。

当我在onCharacteristicChanged()中记录进程的id时,它显示pid=10511 uid=10177,这是托管我的应用程序的进程id。

谁能解释一下上面的行为?为什么在blueooth进程的上下文中调用insert(),而回调本身在我的应用程序进程中运行。

我用的是三星Galaxy S3, Android 4.3。

谢谢

我相信答案在你的错误中是正确的。

requires com.example.permission.ACCESS_CONTENT

你必须允许其他人从你的contentProvider中读取。点击这里阅读更多信息

你能说明你是如何知道主机应用程序有这些权限的吗?我以前问过一个非常类似的问题,在这里:

android:permission="packagename.permissions.BROWSER_PROVIDER"和android: grantUriPermissions ?

最新更新