【问题标题】:Intent call action doesn't work on Marshmallow意图呼叫操作不适用于棉花糖
【发布时间】:2016-08-27 16:05:08
【问题描述】:

我正在尝试在以 Marshmallow 作为操作系统的设备上启动呼叫意图操作,使用与往常相同的步骤(适用于以下版本):

添加权限:

<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:权限拒绝:开始意图{ 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) 在 android.os.Parcel.readException(Parcel.java:1573) 在 android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3130) 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1540) 在 android.app.Activity.startActivityForResult(Activity.java:4283) 在 android.app.Activity.startActivityForResult(Activity.java:4230) 在 android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:849) 在 android.support.v4.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:907) 在 android.support.v4.app.Fragment.startActivity(Fragment.java:919) 在 com.app.calling.activity.fragment.ConnectFragment$2.onGroupClick(ConnectFragment.java:44) 在 android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:676) 在 android.widget.ExpandableListView.performItemClick(ExpandableListView.java:654) 在 android.widget.AbsListView$PerformClick.run(AbsListView.java:3821) 在 android.widget.AbsListView$3.run(AbsListView.java:5841) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:158) 在 android.app.ActivityThread.main(ActivityThread.java:7224) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

同样,这个过程在以前的版本(棒棒糖和 kitkat)中运行良好,不幸的是不在 Marshmallow 上,有人知道我为什么或缺少什么吗?

【问题讨论】:

标签: android android-intent android-permissions


【解决方案1】:

调用方法

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;
        }
    }

【讨论】:

  • 兄弟第二个代码有什么用检查权限,你已经在第一个代码和Android Manifest中询问了权限,那么我们需要那个吗?
  • 第一个代码sn -p:检查之前是否已经授予权限,如果没有授予,提示用户授予该权限。第二个代码sn -p:检查现在是否已经授予权限,如果是,运行onCall()方法。
  • 检查那个问题 bruhhh,我确实喜欢你所说的但仍然没有任何效果,请你检查并告诉我
【解决方案2】:

从 android 6.0 (API 23) 开始,必须在清单中声明危险权限并且您必须明确向用户请求该权限。根据this 列表,CALL_PHONE 被视为危险权限。

每次执行需要危险权限的操作时,都必须检查该权限是否已被用户授予。如果没有,您必须请求授予它。请参阅 Android 开发者上的 Requesting Permissions at Run Time

【讨论】:

  • 坦克你!拯救了我的一天
【解决方案3】:

对于 Marshmallow 及以上版本,您需要在运行时询问权限,而不仅仅是在清单文件中。这是文档:

Requesting Permissions at Run Time

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    相关资源
    最近更新 更多