调用时出现 ActivityNotFoundException Intent.ACTION_CALL
ActivityNotFoundException when calling Intent.ACTION_CALL
我在执行 Intent.ACTION_CALL 操作时得到 ActivityNotFoundException
。我找到了很多链接,但所有这些都无法解决我的问题。
它有时会给我例外,比如
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx pkg=com.android.phone (has extras) }
我在我的项目中使用了以下代码
String contact_number="123456789";
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + contact_number));
startActivity(callIntent);
您应该在启动之前检查是否有任何处理此意图的活动。如果您的应用 运行 在仅具有 wifi 且没有 phone 功能的平板电脑上运行,则可能会发生这种情况。此外,如果您只打算启动拨号程序,最好使用 ACTION_DIAL
而不是 ACTION_CALL
,后者会直接从您的应用程序拨打电话。
final Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"));
if (dialIntent.resolveActivity(context.getPackageManager()) != null) {
// put your logic to launch call app here
}
无法保证可以处理给定的意图(即平板电脑可能根本没有电话应用程序)。如果没有匹配intent-filter
的申请,那么你将面临ActivityNotFoundException
。正确的方法是意识到这一点并使用 try/catch
来阻止崩溃并正确恢复:
try {
String contact_number="123456789";
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + contact_number));
startActivity(callIntent);
} catch (Exception e) {
// no activity to handle intent. show error dialog/toast whatever
}
此外,您应该改用 ACTION_DIAL
,因为 ACTION_CALL
需要额外的权限。
我已经解决了这个问题。我使用了以下代码
String contact_number="123456789";
Intent callIntent = new Intent(Intent.ACTION_CALL);
intent.setPackage("com.android.phone");
callIntent.setData(Uri.parse("tel:" + contact_number));
startActivity(callIntent);
我已将此行替换为 Lollipop
intent.setPackage("com.android.phone");
与
intent.setPackage("com.android.server.telecom");
这是我的代码。
if (BuildUtil.isAndroidM()) {
if (ActivityCompat.checkSelfPermission(mActivity,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(mActivity, PermissionUtil.requestPermissionFineAndCoarse(),
PHONE_REQUEST_CODE);
}
} else {
Intent callIntent = new Intent(Intent.ACTION_CALL);
if (BuildUtil.isAndroidL()) {
callIntent.setPackage("com.android.server.telecom");
} else {
callIntent.setPackage("com.android.phone");
}
callIntent.setData(Uri.parse("tel:" + phone));
startActivity(callIntent);
}
我在执行 Intent.ACTION_CALL 操作时得到 ActivityNotFoundException
。我找到了很多链接,但所有这些都无法解决我的问题。
它有时会给我例外,比如
android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx pkg=com.android.phone (has extras) }
我在我的项目中使用了以下代码
String contact_number="123456789";
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + contact_number));
startActivity(callIntent);
您应该在启动之前检查是否有任何处理此意图的活动。如果您的应用 运行 在仅具有 wifi 且没有 phone 功能的平板电脑上运行,则可能会发生这种情况。此外,如果您只打算启动拨号程序,最好使用 ACTION_DIAL
而不是 ACTION_CALL
,后者会直接从您的应用程序拨打电话。
final Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"));
if (dialIntent.resolveActivity(context.getPackageManager()) != null) {
// put your logic to launch call app here
}
无法保证可以处理给定的意图(即平板电脑可能根本没有电话应用程序)。如果没有匹配intent-filter
的申请,那么你将面临ActivityNotFoundException
。正确的方法是意识到这一点并使用 try/catch
来阻止崩溃并正确恢复:
try {
String contact_number="123456789";
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + contact_number));
startActivity(callIntent);
} catch (Exception e) {
// no activity to handle intent. show error dialog/toast whatever
}
此外,您应该改用 ACTION_DIAL
,因为 ACTION_CALL
需要额外的权限。
我已经解决了这个问题。我使用了以下代码
String contact_number="123456789";
Intent callIntent = new Intent(Intent.ACTION_CALL);
intent.setPackage("com.android.phone");
callIntent.setData(Uri.parse("tel:" + contact_number));
startActivity(callIntent);
我已将此行替换为 Lollipop
intent.setPackage("com.android.phone");
与
intent.setPackage("com.android.server.telecom");
这是我的代码。
if (BuildUtil.isAndroidM()) {
if (ActivityCompat.checkSelfPermission(mActivity,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(mActivity, PermissionUtil.requestPermissionFineAndCoarse(),
PHONE_REQUEST_CODE);
}
} else {
Intent callIntent = new Intent(Intent.ACTION_CALL);
if (BuildUtil.isAndroidL()) {
callIntent.setPackage("com.android.server.telecom");
} else {
callIntent.setPackage("com.android.phone");
}
callIntent.setData(Uri.parse("tel:" + phone));
startActivity(callIntent);
}