2015-09-28 3 views
2

Я играю с чтением Inbox под 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> 

Вы можете увидеть разрешение включено. Что может быть причиной этого?

EDIT 28.9.2015 - Я не указал, что работал с Android Emulator в студии Android, конкретно Android 6.0 (API 23). Под другими эмулированными устройствами с разной версией Android (4.4.2) этот код работает. Может быть, ошибка в Android 6.0 или в эмуляторе? Есть ли какие-либо изменения в A6.0 в отношении разрешений на СМС?

+2

Это действительно выглядит ОК. Попробуйте очистить и перестроить проект. – TDG

+0

Я только что узнал, что это, вероятно, проблема с эмулятором. Я загрузил API 19 и установил новый AVD и угадал, что - он работает ... Может кто-нибудь, пожалуйста, подтвердите проблемы с этим кодом на эмуляторе Android 6.0 (API 23) в Android Studio? –

+0

TDG: это не помогает, очищает, перестраивает, воссоздает код с нуля maaany раз. –

ответ

10

Так что проблема, как уже упоминалось, TDG новое разрешение модели в Android М.

This article помогли мне понять этот вопрос в более ясной форме, чем official android doc.

Просто используйте

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

до выполнения любого кода, связанных с разрешения SMS выполняется, и если разрешение нет, используйте

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

Это относится и к Android Lollipop. Я использовал приведенный выше код, он явно не запрашивает разрешения. и по умолчанию андроид устанавливает его как уведомление об уведомлении – androider

+0

Требуется разрешение на выполнение на Android M и выше. –

Смежные вопросы