public void save(AppCompatActivity context, SMSListener listener) {
mContext = context;
try {
// String mode = SMSData.getSMS_typeText(type_internal);
ContentValues values = returnContentValues(); // content values
ContentResolver resolver = context.getContentResolver();
Uri uri = Telephony.Sms.CONTENT_URI;
if (resolver != null && uri != null)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
ContentProviderClient client =
resolver.acquireContentProviderClient(Telephony.Sms.CONTENT_URI);
client.insert(uri, values);
client.release();
} else {
resolver.insert(uri, values);
}
else {
listener.onCompleted(false);
return;
}
listener.onCompleted(true);
} catch (Exception ex) {
ex.printStackTrace();
listener.onCompleted(false);
}
因此,这是我到目前为止编写的代码,试图编写SMS内容提供者,它在针对SDK级别<30时运行良好,但是对于>= 30,它会抛出以下异常。(试图直接插入内容解析器,而不是ContentProviderClient,但例外情况是一样的!(关于30+)
System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getAuthority()' on a null object reference
System.err: at android.os.Parcel.createExceptionOrNull(Parcel.java:2379)
System.err: at android.os.Parcel.createException(Parcel.java:2357)
System.err: at android.os.Parcel.readException(Parcel.java:2340)
System.err: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:190)
System.err: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
System.err: at android.content.ContentProviderProxy.insert(ContentProviderNative.java:549)
System.err: at android.content.ContentProviderClient.insert(ContentProviderClient.java:348)
System.err: at android.content.ContentProviderClient.insert(ContentProviderClient.java:337)
System.err: at xxxxx.zzzz.dddd.save(SMSCreator.java:94)
我已经检查了SMS内容解析器不为空的权限(通过编写测试代码),然后我了解了Android中与包可见性相关的问题,因此我将其包括在清单中&还包括了QUERY_ALL_PACKAGES
:
<queries>
<package android:name="string" />
<provider
android:authorities="list"
android:exported="false" />
</queries>
为了确保我还运行了一些代码,这些代码打印SMS提供者的权限,输出包括:
[content://sms, content://sms-changes, content://mms-sms]
我还使应用程序默认的SMS应用程序与所有必要的权限。我错过了什么,这样代码就不能在Android Q+中工作了?
此外,我检查了Uri和它的授权值都是空的,那么为什么getAuthority()要抛出空呢?我使用了与Google的消息应用程序类似的代码,结果仍然相同。
UPDATE:虽然我已经对uri做了空检查,但它说在Android10设备上
W/System.err: java.lang.NullPointerException: Uri must not be null
W/System.err: at android.os.Parcel.createException(Parcel.java:2077)
W/System.err: at android.os.Parcel.readException(Parcel.java:2039)
W/System.err: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
W/System.err: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
W/System.err: at android.content.ContentProviderProxy.insert(ContentProviderNative.java:481)
W/System.err: at android.content.ContentProviderClient.insert(ContentProviderClient.java:318)
W/System.err: at xxxxx.zzzz.dddd.save(SMSCreator.java:94)
(使用Pixel 5/Moto One)
发布于 2021-10-05 11:25:23
尝试使用此权限
mActivity.getActivityResultRegistry().register("key", new ActivityResultContracts.OpenDocument(), result -> {
mActivity.getApplicationContext().getContentResolver().takePersistableUriPermission(
result,
Intent.FLAG_GRANT_READ_URI_PERMISSION
);
https://stackoverflow.com/questions/69439279
复制相似问题