如何在 android 中以编程方式进行调用
How to make a call programmatically in android
我想以编程方式从我的 android 应用程序定期 make/receive 调用以进行测试,并从我的网络收集统计信息。所以我的应用程序会每隔一段时间拨打一个号码,当电话被接听时,应用程序将在几秒钟后终止通话。从这里开始是我理解的代码。它会拨打我指定的号码,而无需触摸屏幕。
public class MainActivity extends AppCompatActivity {
int MY_PERMISSIONS_REQUEST_CALL_PHONE = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
call();
}
private void call() {
try {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:2125551212"));
System.out.println("====before startActivity====");
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CALL_PHONE},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
return;
}
startActivity(callIntent);
System.out.println("=====getcallActivity==="+getCallingActivity());
} catch (ActivityNotFoundException e) {
Log.e("helloAndroid","Call failed",e);
}
}
}
清单中有这一行:
根据我的理解,ACTION_CALL 应该可以拨打我提供的号码,而无需按 DIAL 按钮。但是就像 ACTION_DIAL 一样,它会在屏幕上显示号码,然后用户必须按 DIAL 按钮才能拨打电话。那么ACTION_DIAL和ACTION_CALL没有区别吗?
阅读一些帖子后,我了解到需要向用户请求 6.0 以后的权限才能拨打电话(我在上面的代码中使用过)
我的问题是如果我使用 Lollipop(5.0) OS 那么我是否可以不拨号就拨打电话?
除非您是具有特殊系统权限的系统应用程序,否则您实际上无法直接拨打号码。这需要您由 OEM 预安装或作为系统应用程序安装。您需要使用的意图是 android.intent.action.CALL_PRIVILEGED,权限是 android.permission.CALL_PRIVILEGED
ACTION_CALL 和 ACTION_DIAL 的区别在于,拨号启动时会启动拨号器。
ACTION_DIAL
已添加到 API 级别 1
字符串ACTION_DIAL
Activity 操作:拨打数据指定的号码。这显示 UI 正在拨打的号码 ,允许用户 明确地 发起呼叫。
Input:如果没有,则启动一个空拨号器,否则 getData()
是要拨打的 phone 号码或 tel:一个显式 phone 号码的 URI。
输出:无。
常数值:android.intent.action.DIAL
ACTION_CALL
已添加到 API 级别 1
字符串ACTION_CALL
Activity 操作:对数据指定的人执行呼叫。
Input:如果没有,启动一个空的拨号器; else getData()
是要拨打的 phone 号码的 URI 或电话:显式 phone 号码的 URI。
输出:无。
注:
- 将限制哪些应用程序可以发起呼叫;大多数应用程序应该使用
ACTION_DIAL
.
- 此 Intent 不能用于拨打 紧急电话号码 。应用程序可以使用
ACTION_DIAL
. 拨打紧急号码
- 如果您的应用面向 android M 及更高版本并声明使用
CALL_PHONE
未授予的权限,然后尝试使用此操作
将导致 SecurityException.
常数值:android.intent.action.CALL
所以基本上
只打开拨号器应用程序(用户必须按下拨号器应用程序内的呼叫按钮;不需要额外的权限)使用:
String number = "7777777777";
Uri call = Uri.parse("tel:" + number);
Intent surf = new Intent(Intent.ACTION_DIAL, call);
startActivity(surf);
要打开拨号程序并自动拨打电话(需要 android.permission.CALL_PHONE
)然后使用:
String number = "7777777777";
Uri call = Uri.parse("tel:" + number);
Intent surf = new Intent(Intent.ACTION_CALL, call);
startActivity(surf);
我想以编程方式从我的 android 应用程序定期 make/receive 调用以进行测试,并从我的网络收集统计信息。所以我的应用程序会每隔一段时间拨打一个号码,当电话被接听时,应用程序将在几秒钟后终止通话。从这里开始是我理解的代码。它会拨打我指定的号码,而无需触摸屏幕。
public class MainActivity extends AppCompatActivity {
int MY_PERMISSIONS_REQUEST_CALL_PHONE = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
call();
}
private void call() {
try {
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:2125551212"));
System.out.println("====before startActivity====");
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CALL_PHONE},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
return;
}
startActivity(callIntent);
System.out.println("=====getcallActivity==="+getCallingActivity());
} catch (ActivityNotFoundException e) {
Log.e("helloAndroid","Call failed",e);
}
}
}
清单中有这一行:
根据我的理解,ACTION_CALL 应该可以拨打我提供的号码,而无需按 DIAL 按钮。但是就像 ACTION_DIAL 一样,它会在屏幕上显示号码,然后用户必须按 DIAL 按钮才能拨打电话。那么ACTION_DIAL和ACTION_CALL没有区别吗?
阅读一些帖子后,我了解到需要向用户请求 6.0 以后的权限才能拨打电话(我在上面的代码中使用过)
我的问题是如果我使用 Lollipop(5.0) OS 那么我是否可以不拨号就拨打电话?
除非您是具有特殊系统权限的系统应用程序,否则您实际上无法直接拨打号码。这需要您由 OEM 预安装或作为系统应用程序安装。您需要使用的意图是 android.intent.action.CALL_PRIVILEGED,权限是 android.permission.CALL_PRIVILEGED
ACTION_CALL 和 ACTION_DIAL 的区别在于,拨号启动时会启动拨号器。
ACTION_DIAL
已添加到 API 级别 1
字符串ACTION_DIAL
Activity 操作:拨打数据指定的号码。这显示 UI 正在拨打的号码 ,允许用户 明确地 发起呼叫。
Input:如果没有,则启动一个空拨号器,否则 getData()
是要拨打的 phone 号码或 tel:一个显式 phone 号码的 URI。
输出:无。
常数值:android.intent.action.DIAL
ACTION_CALL
已添加到 API 级别 1
字符串ACTION_CALL
Activity 操作:对数据指定的人执行呼叫。
Input:如果没有,启动一个空的拨号器; else getData()
是要拨打的 phone 号码的 URI 或电话:显式 phone 号码的 URI。
输出:无。
注:
- 将限制哪些应用程序可以发起呼叫;大多数应用程序应该使用
ACTION_DIAL
. - 此 Intent 不能用于拨打 紧急电话号码 。应用程序可以使用
ACTION_DIAL
. 拨打紧急号码
- 如果您的应用面向 android M 及更高版本并声明使用
CALL_PHONE
未授予的权限,然后尝试使用此操作 将导致 SecurityException.
常数值:android.intent.action.CALL
所以基本上
只打开拨号器应用程序(用户必须按下拨号器应用程序内的呼叫按钮;不需要额外的权限)使用:
String number = "7777777777";
Uri call = Uri.parse("tel:" + number);
Intent surf = new Intent(Intent.ACTION_DIAL, call);
startActivity(surf);
要打开拨号程序并自动拨打电话(需要 android.permission.CALL_PHONE
)然后使用:
String number = "7777777777";
Uri call = Uri.parse("tel:" + number);
Intent surf = new Intent(Intent.ACTION_CALL, call);
startActivity(surf);