当我调用Threads.getOrCreateThreadId崩溃时

时间:2016-03-03 10:55:28

标签: android

Android源代码6.0

我在AndroidManifest.xml中向TelephonyProvider添加了一个RmsProvider,如:

<provider
    android:name="RmsProvider"
    android:authorities="rms"
    android:exported="true"
    android:multiprocess="false"
    android:singleUser="true"
    android:readPermission="android.permission.READ_SMS"
    android:writePermission="android.permission.WRITE_SMS"
/>

接下来,我创建一个演示,测试&#34;插入&#34;功能

ContentValues values = new ContentValues();
values.put(Rms.BODY, "123444");
values.put(Rms.DATE, System.currentTimeMillis());
values.put(Rms.TIMESTAMP, System.currentTimeMillis() / 1000);
values.put(Rms.READ, true);
values.put(Rms.TYPE, Rms.MESSAGE_TYPE_OUTBOX);
values.put(Rms.STATUS, Rms.STATUS_PENDING);
values.put(Rms.MESSAGE_TYPE, Rms.RMS_MESSAGE_TYPE_TEXT);
values.put(Rms.ADDRESS, "13000000223");
Uri uri = getContentResolver().insert(Rms.CONTENT_URI_LOG, values);

在RmsProvider.java中,它将进入&#34;插入&#34;函数,因为mmss​​ms.db没有13000000223的线程,所以它会调用

threadId = Threads.getOrCreateThreadId(getContext(), "13000000223");

获取一个threadid。当运行到此代码时,它会崩溃。

记录是:

3-03 18:39:34.635  2546  2552 E art     : Failed sending reply to debugger: Broken pipe
03-03 18:39:34.766  1282  2107 E DatabaseUtils: Writing exception to parcel
03-03 18:39:34.766  1282  2107 E DatabaseUtils: java.lang.SecurityException: Proxy package com.android.phone from uid 1001 or calling package com.android.phone from uid 10060 not allowed to perform READ_ICC_SMS
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.app.AppOpsManager.noteProxyOp(AppOpsManager.java:1636)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.content.ContentProvider.checkPermissionAndAppOp(ContentProvider.java:527)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:549)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.content.ContentProvider$Transport.query(ContentProvider.java:211)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.content.ContentResolver.query(ContentResolver.java:491)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.content.ContentResolver.query(ContentResolver.java:434)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.database.sqlite.SqliteWrapper.query(SqliteWrapper.java:59)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.provider.Telephony$Threads.getOrCreateThreadId(Telephony.java:1831)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.provider.Telephony$Threads.getOrCreateThreadId(Telephony.java:1803)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at com.android.providers.telephony.RmsProvider.insert(RmsProvider.java:45)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.content.ContentProvider$Transport.insert(ContentProvider.java:263)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:163)
03-03 18:39:34.766  1282  2107 E DatabaseUtils:     at android.os.Binder.execTransact(Binder.java:453)
--------- beginning of crash
03-03 18:39:34.770  2546  2546 E AndroidRuntime: FATAL EXCEPTION: main
03-03 18:39:34.770  2546  2546 E AndroidRuntime: Process: com.example.deviceapidemo, PID: 2546
03-03 18:39:34.770  2546  2546 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.deviceapidemo/com.example.deviceapidemo.MainActivity}: java.lang.SecurityException: Proxy package com.android.phone from uid 1001 or calling package com.android.phone from uid 10060 not allowed to perform READ_ICC_SMS
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.app.ActivityThread.-wrap11(ActivityThread.java)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:102)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:148)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:5417)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Native Method)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
03-03 18:39:34.770  2546  2546 E AndroidRuntime: Caused by: java.lang.SecurityException: Proxy package com.android.phone from uid 1001 or calling package com.android.phone from uid 10060 not allowed to perform READ_ICC_SMS
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.os.Parcel.readException(Parcel.java:1620)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.content.ContentResolver.insert(ContentResolver.java:1231)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at com.example.deviceapidemo.MainActivity.onCreate(MainActivity.java:78)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.app.Activity.performCreate(Activity.java:6251)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
03-03 18:39:34.770  2546  2546 E AndroidRuntime:    ... 9 more
03-03 18:39:34.844  2573  2573 E QSEECOMD: : Listener: index = 0, hierarchy = 0
03-03 18:39:34.844  2573  2573 E QSEECOMD: : Init dlopen(librpmb.so, RLTD_NOW) is failed....
03-03 18:39:34.845  2573  2573 E QSEECOMD: : ERROR: RPMB_INIT failed, shall not start listener services

我还有另一个测试,我使用

ContentValues values = new ContentValues();
values.put(Sms.BODY, "1231");
values.put(Sms.DATE, System.currentTimeMillis());
values.put(Sms.ADDRESS, "13000000124");
values.put(Sms.TYPE, Sms.MESSAGE_TYPE_OUTBOX);
getContentResolver().insert(Sms.CONTENT_URI, values);

要插入短信,在短信提供者中也会调用

Threads.getOrCreateThreadId(getContext(), address);

但它没有崩溃。

我的RmsProvider.java是:

package com.android.providers.telephony;

import android.app.AppOpsManager;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.Telephony;
import android.provider.Telephony.MmsSms;
import android.provider.Telephony.Threads;
import android.text.TextUtils;
import android.util.Log;
import android.os.Binder;

public class RmsProvider extends ContentProvider {

    public static final String TABLE_RMS = "rms";

    @Override
    public int delete(Uri url, String where, String[] whereArgs) {

        int count = 0;
        return count;
    }

    @Override
    public String getType(Uri url) {
        return null;
    }

    @Override
    public Uri insert(Uri url, ContentValues values) {
        Log.i("ireton", "1");
        long threadId = Threads.getOrCreateThreadId(getContext(), "123");
        Log.i("ireton", "2");
        return null;
    }

    @Override
    public boolean onCreate() {
        setAppOps(AppOpsManager.OP_READ_ICC_SMS, AppOpsManager.OP_WRITE_ICC_SMS);
        mOpenHelper = MmsSmsDatabaseHelper.getInstance(getContext());
        return true;
    }

    @Override
    public Cursor query(Uri url, String[] projectionIn, String selection,
            String[] selectionArgs, String sort) {

        return null;
    }

    @Override
    public int update(Uri url, ContentValues values, String where,
            String[] whereArgs) {
        return 0;
    }

    private SQLiteOpenHelper mOpenHelper;

    private final static String TAG = "RmsProvider";
    private final static String VND_ANDROID_RMS = "vnd.android.cursor.item/rms";

    private static final int RMS_LOG = 0;

    private static final UriMatcher sURLMatcher = new UriMatcher(
            UriMatcher.NO_MATCH);

    static {
        sURLMatcher.addURI("rms", "rms_log", RMS_LOG);
    }
}

1 个答案:

答案 0 :(得分:0)

如果您正在使用AOSP(特别是在Nexus 5设备上),您的版本似乎使用了Google的官方驱动程序包,并且有一些缺少的组件。有一些驱动程序和二进制文件,谷歌没有包含这些设备用于Android 6.0.1。 作为解决方案,您可以从官方ROM / Stock图像中获取丢失的二进制文件,并将其包含在构建系统中。