2016-03-03 47 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 /股票圖像中獲取缺失的二進制文件,並將其包含在構建系統中。

相關問題