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,它会引发以下异常。(也尝试直接使用 Contentresolver 而不是 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 Q 中与包可见性相关的问题,因此我将其包含在清单中并包含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]
我还将该应用设为具有所有必需权限的默认短信应用。我错过了什么,所以代码在 Android Q+ 中不起作用?
[编辑] 另外我检查了 Uri 和它的权限值都不是 null 那么为什么 getAuthority() 抛出 null 呢?我使用了与Google 的消息应用程序类似的代码,结果仍然相同。
更新:虽然我对 uri 进行了空值检查,但它在 Android 10 设备上显示
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)