web-dev-qa-db-ja.com

インテントコールアクションがマシュマロで機能しない

私はマシュマロをOSとするデバイスでコールインテントアクションを開始しようとしています。通常と同じ手順を使用します(これは以下のバージョンで動作しています):

権限を追加:

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

インテントを開きます。

Intent intent = new Intent(Intent.ACTION_CALL);
                    intent.setData(Uri.parse("tel:" + getString(R.string.connect_phone)));
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);

これは私が得ているログです:

致命的な例外:メイン

プロセス:com.app.calling、PID:4250 Java.lang.SecurityException:Permission Denial:starting Intent {act = Android.intent.action.CALL dat = tel:xxxxxxxxxxxxx flg = 0x10000000 cmp = com.Android.server.telecom/.components.UserCallActivity VirtualScreenParam = Params {mDisplayId = -1、null、mFlags = 0x00000000)}} ProcessRecord {1618b01 4250:com.app.calling/u0a234}(pid = 4250、uid = 10234)から、Android.permissionの権限を取り消しました.CALL_PHONE(Android.os.Parcel.readException(Parcel.Java:1620)at Android.os.Parcel.readException(Parcel.Java:1573)(Android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.Java:3130))(Android)。 app.Instrumentation.execStartActivity(Instrumentation.Java:1540)at Android.app.Activity.startActivityForResult(Activity.Java:4283)at Android.app.Activity.startActivityForResult(Activity.Java:4230)at Android.support.v4.app .FragmentActivity.startActivityFromFragment(FragmentActivity.Java:849)at Android.support.v4.app.FragmentActivity $ HostCallbacks.onStartActivityFr omFragment(FragmentActivity.Java:907)at Android.support.v4.app.Fragment.startActivity(Fragment.Java:919)at com.app.calling.activity.fragment.ConnectFragment $ 2.onGroupClick(ConnectFragment.Java:44)at Android.widgetのAndroid.widget.ExpandableListView.performItemClick(ExpandableListView.Java:654)のAndroid.widget.ExpandableListView.handleItemClick(ExpandableListView.Java:676)Android.widgetのAndroid.widget.AbsListView $ PerformClick.run(AbsListView.Java:3821) .AbsListView $ 3.run(AbsListView.Java:5841)at Android.os.Handler.handleCallback(Handler.Java:739)at Android.os.Handler.dispatchMessage(Handler.Java:95)at Android.os.Looper.loop (Looper.Java:158)at Android.app.ActivityThread.main(ActivityThread.Java:7224)at Java.lang.reflect.Method.invoke(Native Method)at com.Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.Java:1230)at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1120)

繰り返しますが、このプロセスは以前のバージョン(LollipopおよびKitKat)では問題なく機能しています。

11

Android 6.0(API 23)から始まり、危険な権限はマニフェスト[〜#〜]および[〜#〜]で宣言する必要がありますその許可をユーザーに明示的に要求する必要があります this リストによれば、CALL_PHONEは危険な許可と見なされます。

危険な権限が必要な操作を実行するたびに、その権限がユーザーによって付与されているかどうかを確認する必要があります。許可されていない場合は、付与を要求する必要があります。 実行時に権限をリクエストする Android Developers。

8
KevinOrr

電話をかける方法

public void onCall() {
        int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE);

        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    this,
                    new String[]{Manifest.permission.CALL_PHONE},
                    "123");
        } else {
            startActivity(new Intent(Intent.ACTION_CALL).setData(Uri.parse("tel:12345678901")));
        }
    }

権限を確認

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {

            case 123:
                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                    onCall();
                } else {
                    Log.d("TAG", "Call Permission Not Granted");
                }
                break;

            default:
                break;
        }
    }
20
Philip BH

マシュマロバージョン以降の場合、マニフェストファイルだけでなく、実行時に権限を要求する必要があります。ここにドキュメントがあります:

実行時に権限を要求する

それが役に立てば幸い。

1
Etienne GT