2016-02-10 11 views
6

Se il dispositivo è in esecuzione Android 6.0 o superiore, quando nel tentativo di ottenere il numero di telefono utilizzando getLine1Number():Android M autorizzazione del READ_PHONE_STATE testata (permessi pericolose)

java.lang.SecurityException: Richiede READ_PHONE_STATE : Né l'utente 10184 né il processo corrente hanno android.permission.READ_PHONE_STATE. Questo sta venendo fuori.

ho dichiarato il permesso come:

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

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

+0

dispiace Sir ho ri-chiedo di nuovo, e grazie per la risposta –

risposta

14

In Android 6.0, è necessario chiedere esplicitamente all'utente di concedere le autorizzazioni. Solo dichiararlo nel manifest non è abbastanza.

Questo documento article è un ottimo punto di partenza per l'apprendimento del nuovo modello, ma fornirò un breve sommario.

Ogni volta che si esegue un'azione che richiede un "permesso pericoloso", è necessario verificare se l'autorizzazione è attualmente concessa, poiché l'utente può revocarla in qualsiasi momento.

Questo può essere fatto con il metodo checkSelfPermission.

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

è possibile richiedere il permesso con il metodo requestPermissions, come tale

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

Dove PERMISSION_READ_STATE è una costante intera definito da voi per il check-in al metodo di callback tardi.

Esegui l'override di onRequestPermissionsResult nella tua attività e verifica se l'autorizzazione è stata concessa. Se lo fosse, puoi andare avanti e preformare l'azione pericolosa.

@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

Sir, è possibile senza disturbare dell'utente ? –

+1

No, dal 6.0 in poi dobbiamo chiedere direttamente all'utente. Se sei più curioso sul motivo per cui questa è la direzione in cui sta andando Android, potresti guardare questo video da Google: https://www.youtube.com/watch?v=f17qe9vZ8RM –

+0

Esiste un elenco di autorizzazioni che devono essere chiesto esplicitamente? – 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(); 
      } 
     } 
    } 
Problemi correlati