2016-02-10 12 views
6

Jeśli urządzenie jest uruchomiony Android 6.0 lub wyższy, gdy im próbuje uzyskać numer telefonu przy użyciu getLine1Number():Android M zgody badanego READ_PHONE_STATE (niebezpieczne uprawnieniami)

java.lang.SecurityException: Wymaga READ_PHONE_STATE : Ani użytkownik 10184, ani obecny proces nie ma android.permission.READ_PHONE_STATE. To wychodzi.

oświadczyłem pozwolenie jak:

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

https://stackoverflow.com/questions/32635704/cant-get-the-permission – CommonsWare

+0

Niestety Sir I znowu ponownie zapytać, i dzięki za odpowiedź –

Odpowiedz

14

W Androidzie 6.0, trzeba wyraźnie zwrócić się do użytkownika, aby przyznać uprawnienia. Samo zadeklarowanie go w manifeście nie wystarczy.

Ten dokument jest świetnym miejscem do nauki nowego modelu, ale podam krótkie podsumowanie.

Za każdym razem, gdy wykonujesz czynność wymagającą "niebezpiecznego pozwolenia", musisz sprawdzić, czy uprawnienie zostało w danej chwili przyznane, ponieważ użytkownik może je odwołać w dowolnym momencie.

Można to zrobić za pomocą metody checkSelfPermission.

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_PHONE_STATE) 
    != PackageManager.PERMISSION_GRANTED) { 
     // We do not have this permission. Let's ask the user 
} 

Można zwrócić się o pozwolenie z metodą requestPermissions jako taki

ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_PHONE_STATE}, PERMISSION_READ_STATE); 

Gdzie PERMISSION_READ_STATE jest stałą liczbą całkowitą zdefiniowane przez użytkownika w celu sprawdzenia metody wywołania zwrotnego później.

Wówczas będziesz nadpisywać numer onRequestPermissionsResult w swojej działalności i sprawdzać, czy pozwolenie zostało przyznane. Jeśli tak, możesz wykonać niebezpieczną akcję.

@Override 
public void onRequestPermissionsResult(int requestCode, 
     String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case PERMISSION_READ_STATE: { 
      if (grantResults.length > 0 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // permission granted! 
       // you may now do the action that requires this permission 
      } else { 
       // permission denied 
      } 
      return; 
     } 

    } 
} 
+0

Panie, Czy to możliwe, bez przeszkadzania użytkownikowi ? –

+1

Nie, od wersji 6.0 musimy zapytać bezpośrednio użytkownika. Jeśli jesteś bardziej ciekawy, dlaczego to jest kierunek, w którym zmierza Android, możesz obejrzeć ten film wideo od Google: https://www.youtube.com/watch?v=f17qe9vZ8RM –

+0

Czy istnieje lista uprawnień, które należy zapytał wyraźnie? – JiTHiN

1
public class MainActivity extends AppCompatActivity { 

    TextView textView; 
    String device_unique_id,IMEI; 


    private static final int MY_PERMISSIONS_REQUEST_READ_PHONE_STATE = 0; 


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

     textView = (TextView)findViewById(R.id.textView); 
    } 
    public void GetImei(View view) 
    { 



     loadIMEI(); 

    } 

    public void loadIMEI() { 
     // Check if the READ_PHONE_STATE permission is already available. 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) 
       != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
        Manifest.permission.READ_PHONE_STATE)) { 
//    get_imei_data(); 
      } else { 
       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 
         MY_PERMISSIONS_REQUEST_READ_PHONE_STATE); 
      } 
     } else { 

      TelephonyManager mngr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
      IMEI = mngr.getDeviceId(); 
      device_unique_id = Settings.Secure.getString(this.getContentResolver(), 
        Settings.Secure.ANDROID_ID); 
      textView.setText(device_unique_id+"----"+mngr.getDeviceId()); 
      // READ_PHONE_STATE permission is already been granted. 
      Toast.makeText(this,"Alredy granted",Toast.LENGTH_SHORT).show(); 
     } 
    } 
     @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) { 

     if (requestCode == MY_PERMISSIONS_REQUEST_READ_PHONE_STATE) { 

      if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

//    Toast.makeText(this,"Alredy DONE",Toast.LENGTH_SHORT).show(); 
       TelephonyManager mngr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
       IMEI = mngr.getDeviceId(); 
       device_unique_id = Settings.Secure.getString(this.getContentResolver(),Settings.Secure.ANDROID_ID); 
       textView.setText(device_unique_id+"----"+mngr.getDeviceId()); 

      } else { 
       Toast.makeText(this,"ehgehfg",Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
Powiązane problemy