2016-02-10 25 views
6

イムは、getLine1Number()を使用して電話番号を取得しようとしたとき、デバイスは、Android 6.0以降を実行している場合:AndroidのMテストREAD_PHONE_STATE(危険なアクセス許可)の許可

java.lang.SecurityException:READ_PHONE_STATEが必要です:ユーザー10184も現在のプロセスもandroid.permission.READ_PHONE_STATEはありません。 これが出ています。

私はとしての許可を宣言:

アンドロイド6.0で
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
+0

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

+0

申し訳ありませんが、サー私は再び-尋ねる再、そして答え –

答えて

14

は、明示的に権限を付与するようにユーザーに依頼する必要があります。マニフェストで宣言するだけでは不十分です。ドキュメント内

このarticleは新しいモデルの学習を始めるには絶好の場所ですが、私は簡単な要約を与えるでしょう。

ユーザーがいつでも取り消すことができますので、あなたが、権限が現在付与されているかどうかを確認する必要がある「危険な許可」が必要ですアクションを実行するたびに。

これはcheckSelfPermission方法で行うことができます。

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

あなたは、このような

PERMISSION_READ_STATEは後でコールバックメソッドにチェックするためにあなたによって定義された定数の整数である
ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.READ_PHONE_STATE}, PERMISSION_READ_STATE); 

として、requestPermissions方法で許可を要求することができます。

次に、あなたの活動にonRequestPermissionsResultをオーバーライドして、許可が付与されたかどうかを確認します。そうだった場合は、先に進み、危険な行動を実行することができます。

@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

卿のおかげで、それはユーザーを乱すことなく可能です? –

+1

いいえ、6.0以降では、ユーザーに直接質問する必要があります。あなたは、これはAndroidが起こっている方向である理由について詳しくは興味がいる場合は、Googleからこのビデオを見るかもしれない:https://www.youtube.com/watch?v=f17qe9vZ8RM –

+0

があることが必要なアクセス許可の一覧があります明らかに尋ねられた? – 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(); 
      } 
     } 
    } 
関連する問題