2015-09-12 19 views
5

Wiem, że zostało to zadane kilkanaście razy wcześniej, ale nadal dostaję błąd uprawnień z tą konfiguracją xml. Przeszukałem inne odpowiedzi na ten temat. Używam poziomu API 23. Czy ktoś może wskazać błąd? Błąd jest oczywisty:Podstawowy błąd w AndroidManifest.xml dla otrzymywania wiadomości SMS

09-12 09: 13: 40.016 1295-1309 /? W/BroadcastQueue: Odmowa zgody: otrzymania Intent {act = android.provider.Telephony.SMS_RECEIVED FLG = 0x8000010 (posiada dodatki)} do com.example.richard.simplesmstoast/.SmsReceiver wymaga android.permission.RECEIVE_SMS spowodowane com.android.phone nadawca (uid 1001)

<application 
    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" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <receiver 
     android:name=".SmsReceiver" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter android:priority="999" > 
      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 
    </receiver> 
</application> 

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

+0

Spróbuj zawierania przed tagiem

+0

@ Vaibhav .. próbowałem tego ... Umieściłem go w różnych miejscach: -/ –

+0

spróbuj wprowadzić następujące zmiany w odbiorniku, a jeśli czytasz SMS, możesz dodać także < intent-filter android: priority = "1000">

Odpowiedz

0

twojej zgody powinien być plac ed na zewnątrz i przed tagu aplikacji:

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
+0

Pretty pewien, że próbowałem to kilka dni temu, ponownie spróbuję tej nocy, kiedy pracuję na komputerze z zainstalowanym SDK. –

16

Problem leży w new permissions model dla Androida M (API 23):

szybkiego podglądu

  • Jeśli aplikacja jest przeznaczona M Preview SDK, to monituje użytkowników o przyznanie uprawnień w czasie wykonywania, zamiast czasu instalacji.
  • Użytkownicy mogą odwołać uprawnienia w dowolnym momencie na ekranie Ustawień aplikacji.
  • Twoja aplikacja musi sprawdzić, czy posiada wymagane uprawnienia przy każdym uruchomieniu.

do dokumentacji sprawy SMS przynieść przykład:

Na przykład, załóżmy, e list aplikacji w jego manifeście, że potrzebuje SEND_SMS i uprawnienia RECEIVE_SMS, które oba należą do android.permission -group.SMS. Gdy aplikacja musi wysłać wiadomość, żąda ona uprawnienia SEND_SMS. System pokazuje użytkownikowi okno dialogowe z pytaniem, czy aplikacja może mieć dostęp do SMS-ów. Jeśli użytkownik się zgodzi, system przyznaje aplikacji uprawnienie SEND_SMS, o które wnioskuje. Później aplikacja żąda aplikacji RECEIVE_SMS. System automatycznie przyznaje to uprawnienie: , ponieważ użytkownik już zatwierdził pozwolenie w tej samej grupie uprawnień.

Solutions:

  • właściwy sposób - Proszę o pozwolenie na początku.
  • leniwy sposób - zestaw targetSdk 22
+0

Zazwyczaj nie komentuję + 1-ki na odpowiedziach, ale z powodu otwartej nagrody muszę powiedzieć, że to właściwa odpowiedź. Nie wiem, jak Android ma zarządzać kompatybilnością ze starszymi aplikacjami działającymi na M po wydaniu, ale długoterminowe poprawki będą wymagać dodania kontroli uprawnień w całym kodzie. –

-1

ten pracował dla mnie ... to sprawdzić Może to pomoże Ci

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@android:style/Theme.Holo.Light.DarkActionBar" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

    <receiver android:name="packageName" > 
     <intent-filter > 

      <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
     </intent-filter> 

    </receiver> 
</application> 

+0

'wpisz tutaj kod"

2

@Richard Zielona: Twój Logcat rzuca

Odmowa zgody: odbieranie Intent { act = android.provider .Telephony.SMS_RECEIVED flg = 0x8000010 (ma dodatki) } do com.example.richard.simplesmstoast/.SmsReceiver r equires android.permission.RECEIVE_SMS powodu nadawcy com.android.phone

Pozwolenie jest ograniczenie ograniczenie dostępu do części kodu lub dane urządzenia. Ograniczenia są nakładane w celu ochrony krytycznych danych i kodu, które mogą zostać wykorzystane w celu zniekształcenia lub uszkodzenia doświadczenia użytkownika.

Zakładam, że jego uprawnienia Problem.

Należy dodać poniżej Manifest -Permissions Przede Aplikacja Tag.

<uses-permission android:name="INTERNET"/> 
    <uses-permission android:name="ACCESS_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.WRITE_SMS" /> 
    <uses-permission android:name="android.permission.READ_SMS" /> 
    <uses-permission android:name="android.permission.RECEIVE_SMS" /> 

Mam nadzieję, że ci to pomoże.

+0

Pozwól mi poinformować, proszę –

0

Dodaj Permission wewnątrz znacznika aplikacji jak ..

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

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

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

    <receiver 
     android:name=".SmsReceiver" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter android:priority="999" > 
      <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
     </intent-filter> 
    </receiver> 
</application> 
1

pierwsze pozwolenie RECEIVE_SMS muszą być zadeklarowane w AndroidManifest.xml.

... 
<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
... 
<receiver 
    android:name=".receiver.IncomingSmsReceiver" 
    android:enabled="true" 
    android:exported="true"> 
    <intent-filter> 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 

Następnie z poziomu interfejsu API 23 musimy zażądać uprawnienia RECEIVE_SMS w czasie wykonywania. Ważne jest, aby to zauważyć. https://developer.android.com/training/permissions/requesting.html

public class MainActivity extends AppCompatActivity { 

    private static final int PERMISSIONS_REQUEST_RECEIVE_SMS = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     // Request the permission immediately here for the first time run 
     requestPermissions(Manifest.permission.RECEIVE_SMS, PERMISSIONS_REQUEST_RECEIVE_SMS); 
    } 


    private void requestPermissions(String permission, int requestCode) { 
     // Here, thisActivity is the current activity 
     if (ContextCompat.checkSelfPermission(this, permission) 
       != PackageManager.PERMISSION_GRANTED) { 

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

       // Show an explanation 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. 
       Toast.makeText(this, "Granting permission is necessary!", Toast.LENGTH_LONG).show(); 

      } else { 

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

       ActivityCompat.requestPermissions(this, 
         new String[]{permission}, 
         requestCode); 

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

    @Override 
    public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case PERMISSIONS_REQUEST_RECEIVE_SMS: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

        // permission was granted, yay! Do the 
        // contacts-related task you need to do. 

        NotificationUtil.getInstance().show(this, NotificationUtil.CONTENT_TYPE.INFO, 
          getResources().getString(R.string.app_name), 
          "Permission granted!"); 

       } else { 

        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 

        NotificationUtil.getInstance().show(this, NotificationUtil.CONTENT_TYPE.ERROR, 
          getResources().getString(R.string.app_name), 
          "Permission denied! App will not function correctly"); 
       } 
       return; 
      } 

      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 
} 

Nadzieja to pomóc.

+1

Po pierwsze, jest nie jest złą odpowiedzią na pierwszy post. Chciałbym zauważyć, że plakat prawidłowo udzielił pozwolenia, a to jest problem API23. Nie trzeba powtarzać. Jest to również doskonały czas na oznaczenie pytania jako duplikatu. Tylko że we wrześniu zapytano go i odpowiedział poprawnie, więc może tak nie jest. W każdym razie, ktoś nagrodził nagrodę, więc prawdopodobnie nadszedł czas, aby odejść, chyba że masz coś naprawdę ekscytującego do dodania. –

+0

Dzięki @Roy Falk tylko moje gotcha podczas spotkania API23. Zajęło mi chwilę, aby rozejrzeć się za rozwiązaniem, więc podzielę się tutaj, aby mieć nadzieję, że pomoże innym. –

0
  • Jeśli kierujesz reklamę na Marshmallow, musisz poprosić o pozwolenie na wykonywanie poza manifestem.

Oczywisty - Klasa aktywności

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

Java -

final int REQ_CODE = 100; 
void requestPermission(){ 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) { 
     CTLogs.printLogs("Permission is not granted, requesting"); 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS,Manifest.permission.READ_SMS,Manifest.permission.RECEIVE_SMS}, REQ_CODE); 

    } else { 
     CTLogs.printLogs("Permission has been granted"); 
     readSMS(); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (requestCode == REQ_CODE) { 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      CTLogs.printLogs("Permission has been granted"); 
      readSMS(); 
     } else { 
      CTLogs.printLogs("Permission denied !!!"); 
     } 
    } 
} 
-1
//Requesting permission 
private void requestWritePermission() { 
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_SMS) == PackageManager.PERMISSION_GRANTED) 
     return; 

    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_SMS)) { 
     //If the user has denied the permission previously your code will come to this block 
     //Here you can explain why you need this permission 
     //Explain here why you need this permission 
    } 
    //And finally ask for the permission 
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_SMS}, WRITE_SMS_PERMISSION_CODE); 
} 

Błąd na pozwolenie WRTIE_SMS

+1

Czy możesz podać odpowiedź? Teraz nie jest jasne, aby to zrozumieć. – Shashanth

Powiązane problemy