【问题标题】:How to make a call programmatically in android [duplicate]如何在android中以编程方式拨打电话[重复]
【发布时间】:2018-06-18 17:08:29
【问题描述】:

我想通过我的 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 应该拨打我提供的号码,而无需按下 DIAL 按钮。但是就像 ACTION_DIAL 一样,它会在屏幕上显示号码,然后用户必须按下 DIAL 按钮才能拨打电话。那么 ACTION_DIAL 和 ACTION_CALL 没有区别吗?

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

我的问题是,如果我使用 Lollipop(5.0) 操作系统,那么我可以在不拨号的情况下拨打电话吗?

【问题讨论】:

    标签: android android-5.0-lollipop phone-call


    【解决方案1】:

    ACTION_DIAL

    在 API 级别 1 中添加

    字符串 ACTION_DIAL

    活动操作:拨打数据指定的号码。这显示了一个用户界面正在拨打的号码,允许用户明确发起呼叫。

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

    输出:没有。

    常数值android.intent.action.DIAL


    ACTION_CALL

    在 API 级别 1 中添加

    字符串 ACTION_CALL

    活动操作给数据指定的人打电话

    输入:如果没有,则启动一个空拨号器; else 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)然后使用:

    String number = "7777777777";
    Uri call = Uri.parse("tel:" + number);             
    Intent surf = new Intent(Intent.ACTION_CALL, call); 
    startActivity(surf); 
    

    【讨论】:

    • 非常感谢。效果很好!我应该能够将其设置为 AsyncTask 吗?
    • 不清楚你的意思,AsyncTask是在Android中实现并行的最简单的方法之一,而不必处理像Threads这样更复杂的方法,所以如果你想执行一些并行工作你可以拥有它但是要拨打或拨打电话,请确保您在 UI 线程上执行此操作,否则它会崩溃。如果您想在后台线程中的某个进程之后拨打电话,请使用 onPostExecute ..
    【解决方案2】:

    除非您是具有特殊系统权限的系统应用程序,否则您实际上无法直接呼叫号码。这需要您由 OEM 预安装或作为系统应用程序获得 root 权限并安装。你需要使用的intent是android.intent.action.CALL_PRIVILEGED,权限是android.permission.CALL_PRIVILEGED

    ACTION_CALL 和 ACTION_DIAL 的区别在于拨号启动时拨号器向上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多