2016-03-03 50 views
1

Android源代码6.0当我打电话Threads.getOrCreateThreadId崩溃

我在AndroidManifest.xml中添加RmsProvider到TelephonyProvider,如:

<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" 
/> 

接下来,我创建了一个演示,测试 “插入” 功能。

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将进入“插入”功能,因为mmss​​ms.db不具备13000000223线程,所以它会调用

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

获得线程ID。运行到此代码时,会崩溃。

日志是:

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); 

插入一个短信,在短信提供商ALSE将调用

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); 
    } 
} 

回答

0

如果您在AOSP工作(尤其是Nexus 5的设备上),似乎你的构建用官方的驱动程序包,从谷歌,也有一些缺失的部分。有一些驱动程序和二进制文件不包括在谷歌那些用于android 6.0.1的设备中。 作为解决方案,您可以从官方的ROM /股票图像中获取缺失的二进制文件,并将其包含在构建系统中。

相关问题