2015-09-28 99 views
2

我正在閱讀Android API 15閱讀收件箱,我被困在以下問題上:爲什麼Android會忽略READ_SMS權限?

我的應用程序只有一個活動,默認情況下啓動了主活動。它有這個onCreate代碼

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_unlock); 


     // Create Inbox box URI 
     Uri inboxURI = Uri.parse("content://sms/inbox"); 

     // List required columns 
     String[] reqCols = new String[] { "_id", "address", "body" }; 

     // Get Content Resolver object, which will deal with Content Provider 
     ContentResolver cr = getContentResolver(); 

     // Fetch Inbox SMS Message from Built-in Content Provider 
     Cursor c = cr.query(inboxURI, reqCols, null, null, null); 

    } 

趁現在這段代碼沒有任何用處,只是獲取數據,並準備光標,這樣我可以遍歷它們,它會導致以下錯誤:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cryptail.stealthsms/com.cryptail.stealthsms.UnlockActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms/inbox from pid=4362, uid=10059 requires android.permission.READ_SMS, or grantUriPermission() 

錯誤與Cursor c = cr.query代碼發生衝突,並促請我使用READ_SMS權限。

這是我的清單XML

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.cryptail.stealthsms" > 


    <uses-permission android:name="android.permission.READ_SMS" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 


     <activity 
      android:name=".UnlockActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:naame="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

你可以看到權限包括在內。什麼可能造成這種情況?

編輯28.9.2015 - 我沒有指定我在Android Studio中使用Android模擬器,具體是Android 6.0(API 23)。在另一個具有不同Android版本(4.4.2)的仿真設備下,此代碼可用。所以也許在Android 6.0或模擬器本身的錯誤? A6.0中是否有關於SMS權限的更改?

+2

這真的看起來不錯。嘗試清理並重建您的項目。 – TDG

+0

我剛剛發現這可能是模擬器問題。我下載了API 19並設置了新的AVD,並猜測它的工作原理......有人可以在Android Studio的Android 6.0(API 23)模擬器上確認此代碼的問題嗎? –

+0

TDG:這並沒有幫助,清理,重建,從零開始重新創建代碼。 –

回答

10

所以,問題是,由TDG,在Android的M.新的權限模型提到

This article幫助我理解這個問題比official android doc更明確的方式。

只需使用

if(ContextCompat.checkSelfPermission(getBaseContext(), "android.permission.READ_SMS") == PackageManager.PERMISSION_GRANTED) { 

執行任何短信權限相關的代碼之前,如果權限是不存在的,使用

final int REQUEST_CODE_ASK_PERMISSIONS = 123; 
ActivityCompat.requestPermissions(UnlockActivity.this, new String[]{"android.permission.READ_SMS"}, REQUEST_CODE_ASK_PERMISSIONS); 
+0

這也適用於Android棒棒糖。我使用了上面的代碼,它沒有明確地要求許可。並且默認情況下android會將其安裝爲通知權限 – androider

+0

Android M及更高版本需要運行時權限。 –