意图呼叫操作不适用于 Marshmallow
Intent call action doesn't work on Marshmallow
我正在尝试在 Marshmallow 为 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);
这是我得到的日志:
FATAL EXCEPTION: main
Process: 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)} }
from ProcessRecord{1618b01 4250:com.app.calling/u0a234} (pid=4250,
uid=10234) with revoked permission android.permission.CALL_PHONE
at android.os.Parcel.readException(Parcel.java:1620)
at android.os.Parcel.readException(Parcel.java:1573)
at
android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3130)
at
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.onStartActivityFromFragment(FragmentActivity.java:907)
at android.support.v4.app.Fragment.startActivity(Fragment.java:919)
at
com.app.calling.activity.fragment.ConnectFragment.onGroupClick(ConnectFragment.java:44)
at
android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:676)
at
android.widget.ExpandableListView.performItemClick(ExpandableListView.java:654)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3821)
at android.widget.AbsListView.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)中运行良好,不幸的是不在 Marshmallow 上,有人知道为什么或我遗漏了什么吗?
对于 Marshmallow 版本及更高版本,您需要在运行时请求许可,而不仅仅是在清单文件中。这是文档:
Requesting Permissions at Run Time
希望对您有所帮助。
从 android 6.0 (API 23) 开始,必须在清单中声明危险权限 AND 您必须向用户明确请求该权限.根据 this 列表,CALL_PHONE
被认为是危险权限。
每次执行需要危险权限的操作时,您必须检查该权限是否已被用户授予。如果没有,您必须请求批准。请参阅 Android 开发人员的 Requesting Permissions at Run Time。
Method to make call
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")));
}
}
Check permission
@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;
}
}
我正在尝试在 Marshmallow 为 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);
这是我得到的日志:
FATAL EXCEPTION: main
Process: 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)} } from ProcessRecord{1618b01 4250:com.app.calling/u0a234} (pid=4250, uid=10234) with revoked permission android.permission.CALL_PHONE at android.os.Parcel.readException(Parcel.java:1620) at android.os.Parcel.readException(Parcel.java:1573) at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3130) at 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.onStartActivityFromFragment(FragmentActivity.java:907) at android.support.v4.app.Fragment.startActivity(Fragment.java:919) at com.app.calling.activity.fragment.ConnectFragment.onGroupClick(ConnectFragment.java:44) at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:676) at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:654) at android.widget.AbsListView$PerformClick.run(AbsListView.java:3821) at android.widget.AbsListView.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)中运行良好,不幸的是不在 Marshmallow 上,有人知道为什么或我遗漏了什么吗?
对于 Marshmallow 版本及更高版本,您需要在运行时请求许可,而不仅仅是在清单文件中。这是文档:
Requesting Permissions at Run Time
希望对您有所帮助。
从 android 6.0 (API 23) 开始,必须在清单中声明危险权限 AND 您必须向用户明确请求该权限.根据 this 列表,CALL_PHONE
被认为是危险权限。
每次执行需要危险权限的操作时,您必须检查该权限是否已被用户授予。如果没有,您必须请求批准。请参阅 Android 开发人员的 Requesting Permissions at Run Time。
Method to make call
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")));
}
}
Check permission
@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;
}
}