gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:05:35 27 4
gpt4 key购买 nike

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

我正在编写一个 Android 服务,该服务使用低功耗蓝牙 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.bluetooth”进程的进程id。上面的堆栈跟踪显示,正在蓝牙进程的上下文中调用内容提供者的插入。当然这个进程没有权限写入content provider所以这个异常。

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

有人可以解释上述行为吗?为什么在我的应用程序进程中运行回调本身时在蓝牙进程的上下文中调用 insert()。

我在 Samsung Galaxy S3、Android 4.3 上运行。

谢谢

最佳答案

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

需要 com.example.permission.ACCESS_CONTENT

您必须允许其他人读取您的 contentProvider。了解更多信息 here

您能否说明您是如何知道宿主应用程序具有这些权限的?我过去在这里问过一个非常相似的问题:

What's the difference between android:permission="packagename.permissions.BROWSER_PROVIDER" and android:grantUriPermissions?

关于android - 在 BluetoothGattCallback 中使用 Content Provider 时的安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22309885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com