如何在Android中通过编程实现打电话

9

我希望能够从我的Android应用程序定期发起/接收测试目的的电话,并从我的网络中收集统计数据。因此,我的应用程序将每隔一段时间呼叫一个号码,当通话接通后,应用程序将在几秒钟后终止通话。以下是我理解的可能适用的代码。它将拨号并呼叫我指定的号码,而无需我触摸屏幕。

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应该直接拨打我提供的号码,而不需要按下“拨号”按钮。但是它的作用就像ACTION_DIAL,显示号码在屏幕上,用户必须按下“拨号”按钮才能拨打电话。那么ACTION_DIAL和ACTION_CALL之间没有区别吗?

阅读了一些帖子后,我了解到从6.0开始需要向用户请求权限才能拨打电话(我在上面的代码中使用了这个)。

我的问题是,如果我使用Lollipop(5.0)操作系统,我是否能够在不拨号的情况下拨打电话?

2个回答

12

ACTION_DIAL

API level 1 中添加

字符串 ACTION_DIAL

Activity Action: 拨打指定数据的号码。这会显示一个带有正在拨打的号码的UI,允许用户明确发起通话。

输入:如果什么都没有,则启动空拨号器;否则,getData() 是要拨打的电话号码的 URI 或显式电话号码的 tel: URI

输出:无。

常量值android.intent.action.DIAL


ACTION_CALL

API level 1 中添加

字符串 ACTION_CALL

Activity Action: 对由数据指定的某人执行呼叫。

输入:如果什么都没有,则启动空拨号器;否则,getData() 是要拨打的电话号码的 URI 或显式电话号码的 tel: 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权限),然后使用以下代码:

```java Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + phoneNumber)); startActivity(intent); ```
```phoneNumber``` 是要拨打的电话号码。
String number = "7777777777";
Uri call = Uri.parse("tel:" + number);             
Intent surf = new Intent(Intent.ACTION_CALL, call); 
startActivity(surf); 

非常感谢。它运行得很好!我能将其设置为AsyncTask吗? - Ram Ramesh
1
不清楚你的意思,AsyncTask是在Android中实现并行处理最简单的方法之一,而无需处理像线程这样更复杂的方法,因此如果您想执行一些并行工作,可以使用它,但是如果要拨打电话,请确保在UI线程上进行,否则会崩溃。如果您想在后台线程中进行某些进程后拨打电话,请使用onPostExecute。 - Charuක

2

除非您是具有特殊系统权限的系统应用程序,否则无法直接拨打号码。这需要您由OEM预安装或通过root并安装为系统应用程序。您需要使用的意图是android.intent.action.CALL_PRIVILEGED,权限是android.permission.CALL_PRIVILEGED。

ACTION_CALL和ACTION_DIAL之间的区别在于dial启动时会启动拨号器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接