2015-09-17 5 views
99

Я пытаюсь написать код для отправки SMS из Android приложения, но когда я пытаюсь отправить SMS отправляет меня обратно сообщение об ошибке:Android разрешение не работает, даже если я объявил его

09-17 18:37:29.974 12847-12847/**.**.****E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: **.**.****, PID: 12847 
java.lang.SecurityException: Sending SMS message: uid 10092 does not have android.permission.SEND_SMS. 
     at android.os.Parcel.readException(Parcel.java:1599) 
     at android.os.Parcel.readException(Parcel.java:1552) 
     at com.android.internal.telephony.ISms$Stub$Proxy.sendTextForSubscriber(ISms.java:768) 
     at android.telephony.SmsManager.sendTextMessageInternal(SmsManager.java:310) 
     at android.telephony.SmsManager.sendTextMessage(SmsManager.java:293) 
     at **.**.****.MainActivity$3.onClick(MainActivity.java:70) 
     at android.view.View.performClick(View.java:5198) 
     at android.view.View$PerformClick.run(View.java:21147) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Я проверил, но у меня есть разрешения в манифесте, следующим образом:

<?xml version="1.0" encoding="utf-8"?> 

<uses-permission android:name="android.permission.SEND_SMS"/> 
<uses-feature android:name="android.hardware.telephony" 
    android:required="true"/> 

<application 
    android:exported="true" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"> 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

Я искал в Интернете, но все ошибки были связаны с синтаксисом , не могли бы вы мне помочь?

+0

Какую версию Android вы тестирование на? – CommonsWare

+0

Я тестирую на android 6.0 –

+1

уверен, что он будет работать над версией Android. Есть новая философия разрешений в android 6.0 – Fakher

ответ

172

(следующая извлекается из a blog post of mine about this)

Большая причина не получить разрешение на сегодняшний день, потому что ваш проект имеет targetSdkVersion 23 или выше, а разрешение , что вы запрашиваете это " опасно». В Android 6.0, это включает в себя:

  • ACCESS_COARSE_LOCATION
  • ACCESS_FINE_LOCATION
  • ADD_VOICEMAIL
  • BODY_SENSORS
  • CALL_PHONE
  • CAMERA
  • GET_ACCOUNTS
  • PROCESS_OUTGOING_CALLS
  • READ_CALENDAR
  • READ_CALL_LOG
  • READ_CELL_BROADCASTS
  • READ_CONTACTS
  • READ_EXTERNAL_STORAGE
  • READ_PHONE_STATE
  • READ_SMS
  • RECEIVE_MMS
  • RECEIVE_SMS
  • RECEIVE_WAP_PUSH
  • RECORD_AUDIO
  • SEND_SMS
  • USE_SIP
  • WRITE_CALENDAR
  • WRITE_CALL_LOG
  • WRITE_CONTACTS
  • WRITE_EXTERNAL_STORAGE

Для этих разрешений, не только ваш targetSdkVersion 23+ приложению нужно иметь <uses-permission> элемент (ы), но вы также должны попросить эти разрешения во время выполнения от пользователя на Android 6.0+ устройства, используя методы, такие как checkSelfPermission() и requestPermissions().

В качестве временного решения, падение вашего targetSdkVersion ниже 23.

Однако, в конце концов, у вас будет какая-то причина, чтобы хотеть ваш targetSdkVersion быть 23 или выше. В то время вам понадобится , чтобы настроить приложение для использования новой системы разрешений во время выполнения. В документации для Android есть a page dedicated to this topic.

+1

Большое спасибо, я использовал методы requestPermissions(), и я отлично поработал –

+0

Спасибо, это очень помогло! :) –

+0

Хорошо, я попытался это раньше, но не смог получить методы ContextCompat.checkSelfPermission и ActivityCompat.requestPermissions, они дайте мне ошибку «not found» в именах методов. Я предполагаю, что это связано с отсутствующей библиотекой, похоже, что она находится в пакете v4, но моя единственная зависимость от градиента - это «компиляция» com.android.support: appcompat-v7: 22.2.1''. Должен ли я изменить это на v4? – Ozzy

-3

Поскольку sdk 23 или более поздняя версия вводит новый способ запроса разрешений, поэтому, если вы запуститесь в Marshmallow, он отобразит эту ошибку.

Решения: Set targetSdkVersion сильфонных 23 в файле манифеста, как этот андроид: targetSdkVersion = "21"

3

Если вы используете SDK 23 или выше, то вы должны проверить запуск разрешения времени.

0

Наряду с ответом CommonsWare, в

Существует Настроечная безопасность (я проверил на CM13) для установки SMS сообщения Limit. Если вы установите значение «Нет», ОС выведет диалоговое окно для каждого SMS, даже после получения разрешения SMS_SEND во время выполнения. Лучше всего установить это максимум.

Если максимального значения недостаточно, существуют способы увеличить максимальную скорость на корневом устройстве.

2

при объявлении в Manifestpermisson, и это не означает, что работы вы выполняете задачи в MarshMallow и MarshMallow вы установили в RunTime согласия автора.

как таким образом

ActivityCompat.requestPermissions(); 
0

Я добавил это к моему MainActivity, что решить мою проблему

 int MY_PERMISSIONS_REQUEST_READ_CONTACTS=0; 
// Here, thisActivity is the current activity 
     if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       != PackageManager.PERMISSION_GRANTED) { 

      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 

       // Show an expanation to the user *asynchronously* -- don't block 
       // this thread waiting for the user's response! After the user 
       // sees the explanation, try again to request the permission. 

      } else { 

       // No explanation needed, we can request the permission. 

       ActivityCompat.requestPermissions(this, 
         new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
         MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

       // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
       // app-defined int constant. The callback method gets the 
       // result of the request. 
      } 
     } 
15

выше уровня 23 API вам дадут разрешение прагматично, как:

private static final int PERMISSION_REQUEST_CODE = 1; 

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { 

     if (checkSelfPermission(Manifest.permission.SEND_SMS) 
       == PackageManager.PERMISSION_DENIED) { 

      Log.d("permission", "permission denied to SEND_SMS - requesting it"); 
      String[] permissions = {Manifest.permission.SEND_SMS}; 

      requestPermissions(permissions, PERMISSION_REQUEST_CODE); 

     } 
    } 
1

ActivityCompat.requestPermissions (это новая строка [] {Manifest.permission.SEND_SMS}, 1);
после API 23

0

Если вы используете версию Android «23» или «23+», приложение покажет вам ошибки, когда вы пытаетесь получить доступ к чему-либо, что требует разрешения пользователя. Вы должны запрашивать разрешения во время выполнения, даже если вы объявили эти разрешения в манифесте Android.

Проверьте это: https://developer.android.com/training/permissions/requesting.html

Но если вы создали всю вашу заявку и не хотят менять на каждом месте, то немного обманщик будет достаточно.

Перейти к файлу «build.gradle» и изменить целевую SDk версию до менее чем 23, как 22, 21.

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