【问题标题】:Uri null after null check - SMS Content provider [Android SDK 30+]空检查后的 Uri null - SMS 内容提供程序 [Android SDK 30+]
【发布时间】:2021-11-25 01:45:31
【问题描述】:
    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,它会引发以下异常。 (也尝试直接使用 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 content resolver is not null 的权限(通过编写测试代码),然后我了解了 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+ 中不起作用?

[edit] 另外我检查了 Uri 和它的权限值都不是 null 那么为什么 getAuthority() 会抛出 null 呢?我用了和Google's messaging app类似的代码,结果还是一样。

更新:虽然我对 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)

【问题讨论】:

  • 你有 uri 吗?或者只是得到空?因为你只能得到一个不正确的 uri 路径
  • URI不是空的,我已经检查过了,但是运行insert说它是空的,只有当targetSDK是30+时
  • 这可能与新的权限限制有关,但我在任何地方都找不到有关此的帖子。
  • 我想我知道你需要使用什么权限,我会写一个答案

标签: android sms messaging telephonymanager android-sms


【解决方案1】:

尝试使用此权限


mActivity.getActivityResultRegistry().register("key", new ActivityResultContracts.OpenDocument(), result -> {
                        mActivity.getApplicationContext().getContentResolver().takePersistableUriPermission(
                                result,
                                Intent.FLAG_GRANT_READ_URI_PERMISSION
                        );

【讨论】:

  • 它没有用,同样的问题。我正在阅读这个应用程序的代码以了解他们做了什么,但他们显然在运行相同的代码,并且它以某种方式工作。我会做更多的研究:github.com/moezbhatti/qksms
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
相关资源
最近更新 更多