web-dev-qa-db-ja.com

許可の取り消しAndroid.permission.CALL_PHONE

次のコードを使用して、プログラムで番号を呼び出そうとしています。

 String number = ("tel:" + numTxt.getText());
 Intent intent = new Intent(Intent.ACTION_CALL);
 intent.setData(Uri.parse(number));
 startActivity(intent);

マニフェストで許可を設定しました:

<uses-permission Android:name="Android.permission.CALL_PHONE"/>

テストとデバッグのために実際のデバイスを使用しています。Nexus5でAndroid M、私のcompileSdkVersionは23です。次のセキュリティ例外が発生しています。

error: Permission Denial: starting Intent { act=Android.intent.action.CALL dat=tel:xxxxxxxxxx cmp=com.Android.server.telecom/.components.UserCallActivity } from ProcessRecord{cbbd7c1 5228:com.dialerTest.DialerApp/u0a96} (pid=5228, uid=10096) with revoked permission Android.permission.CALL_PHONE

ウェブとこのコミュニティで同様のQ/Aを検索しましたが、答えが見つかりませんでした。任意の助けをいただければ幸いです。

17

Android 6.0(Apiレベル23)には、「ランタイムのアクセス許可」と呼ばれるものがあります。これについて読む必要があります。

ドキュメントを見つけることができます こちら

17

許可CALL_PHONEは危険な許可グループに属します。
したがって、アプリのターゲットSDKが23以上で、デバイスがAndroid 6.0以上で実行されている場合、アプリの実行中にCALL_PHONE権限を要求する必要があります。

例:

String number = ("tel:" + numTxt.getText());
mIntent = new Intent(Intent.ACTION_CALL);
mIntent.setData(Uri.parse(number));
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.CALL_PHONE)
    != PackageManager.PERMISSION_GRANTED) {

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

    // MY_PERMISSIONS_REQUEST_CALL_PHONE is an
    // app-defined int constant. The callback method gets the
    // result of the request.
} else {
    //You already have permission
     try {
        startActivity(mIntent); 
    } catch(SecurityException e) {
       e.printStackTrace();
   }
}

アプリが許可を要求すると、システムはユーザーにダイアログボックスを表示します。ユーザーが応答すると、システムはアプリのonRequestPermissionsResult()メソッドを呼び出し、ユーザー応答を渡します。

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

            // permission was granted, yay! Do the phone call

        } else {

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

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

許可を要求する必要があるACTION_DIALではなくACTION_CALLを作成する場合にのみコードを機能させることができます。したがって、呼び出しを行う場合は、次の例を参照してください。

[〜#〜] manifest [〜#〜]

<uses-permission Android:name="Android.permission.CALL_PHONE" />

コード

import static Android.Manifest.permission.CALL_PHONE;

Intent i = new Intent(Intent.ACTION_CALL);
i.setData(Uri.parse("tel:0612312312"));
/*
Intent i = new Intent(Intent.ACTION_DIAL);
i.setData(Uri.parse("tel:0612312312"));
if (i.resolveActivity(getPackageManager()) != null) {
      startActivity(i);
}*/
if (ContextCompat.checkSelfPermission(getApplicationContext(), CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
      startActivity(i);
} else {
      requestPermissions(new String[]{CALL_PHONE}, 1);
}
4