Android实现拨打电话功能

简介: Android实现拨打电话功能

先上UI效果图

点击联系博主


拒绝权限

同意权限

直接拨号


跳转到拨号界面


跳转到拨号界面 同时附带号码


代码实现

AndroidManifest.xml中添加权限

<uses-permission android:name="android.permission.CALL_PHONE" />

点击联系博主

    contactBlogger.setOnClickListener(v -> {
            callPhone();
//            callUI();
//            callPhoneUI();
        });

判断是否有拨号权限

  // 判断是否有拨号权限
    private boolean ifHaveCallPhonePermission() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            // 动态申请权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, CALL_PHONE_REQUEST_CODE);
            return false;
        }
        return true;
    }

申请权限回调

  // 申请权限回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == CALL_PHONE_REQUEST_CODE) {
            if (permissions.length != 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "请添加拨号权限后重试", Toast.LENGTH_SHORT).show();
            } else {
                callPhone();
//                callUI();
//                callPhoneUI();
            }
        }
    }
// 申请

直接拨号

  // 直接拨号
    private void callPhone() {
        if (ifHaveCallPhonePermission()) {
            startActivity(new Intent(Intent.ACTION_CALL, Uri.parse(phone)));
        }
    }

跳转到拨号界面

  // 跳转到拨号界面
    private void callUI() {
        if (ifHaveCallPhonePermission()) {
            startActivity(new Intent(Intent.ACTION_CALL_BUTTON));
        }
    }

跳转到拨号界面 同时附带号码

  // 跳转到拨号界面 同时附带号码
    private void callPhoneUI() {
        if (ifHaveCallPhonePermission()) {
            startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(phone)));
        }
    }

完整代码

MainActivity.java

package top.gaojc.callphonedemo;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Button contactBlogger;
    private final String phone = "tel:13103679960";
    private final int CALL_PHONE_REQUEST_CODE = 10001;//拨号请求码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        contactBlogger = findViewById(R.id.contact_blogger);

        contactBlogger.setOnClickListener(v -> {
            callPhone();
//            callUI();
//            callPhoneUI();
        });
    }

    // 判断是否有拨号权限
    private boolean ifHaveCallPhonePermission() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
            // 动态申请权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, CALL_PHONE_REQUEST_CODE);
            return false;
        }
        return true;
    }

    // 申请权限回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == CALL_PHONE_REQUEST_CODE) {
            if (permissions.length != 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "请添加拨号权限后重试", Toast.LENGTH_SHORT).show();
            } else {
                callPhone();
//                callUI();
//                callPhoneUI();
            }
        }
    }

    // 直接拨号
    private void callPhone() {
        if (ifHaveCallPhonePermission()) {
            startActivity(new Intent(Intent.ACTION_CALL, Uri.parse(phone)));
        }
    }

    // 跳转到拨号界面
    private void callUI() {
        if (ifHaveCallPhonePermission()) {
            startActivity(new Intent(Intent.ACTION_CALL_BUTTON));
        }
    }

    // 跳转到拨号界面 同时附带号码
    private void callPhoneUI() {
        if (ifHaveCallPhonePermission()) {
            startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(phone)));
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/contact_blogger"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="@string/contact_blogger" />

</FrameLayout>
目录
相关文章
|
7月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
164 0
|
2月前
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
76 4
Android开发表情emoji功能开发
|
2月前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
57 3
|
4月前
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
449 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
3月前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
|
4月前
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
6月前
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
291 2
|
6月前
|
Android开发
Android中如何快速的实现RecycleView的拖动重排序功能
使用`ItemTouchHelper`和自定义`Callback`,在`RecyclerView`中实现拖动排序功能。定义`ItemTouchHelperAdapter`接口,`Adapter`实现它以处理`onItemMove`方法。`SimpleItemTouchHelperCallback`设置拖动标志,如`LEFT`或`RIGHT`(水平拖动),并绑定到`RecyclerView`以启用拖动。完成这些步骤后,即可实现拖放排序。关注公众号“AntDream”获取更多内容。
126 3
|
7月前
|
移动开发 监控 Android开发
构建高效Android应用:从内存优化到电池寿命代码之美:从功能实现到艺术创作
【5月更文挑战第28天】 在移动开发领域,特别是针对Android系统,性能优化始终是关键议题之一。本文深入探讨了如何通过细致的内存管理和电池使用策略,提升Android应用的运行效率和用户体验。文章不仅涵盖了现代Android设备上常见的内存泄漏问题,还提出了有效的解决方案,包括代码级优化和使用工具进行诊断。同时,文中也详细阐述了如何通过减少不必要的后台服务、合理管理设备唤醒锁以及优化网络调用等手段延长应用的电池续航时间。这些方法和技术旨在帮助开发者构建更加健壮、高效的Android应用程序。
|
7月前
|
Android开发 数据安全/隐私保护 iOS开发
ios和安卓测试包发布网站http://fir.im的注册与常用功能
ios和安卓测试包发布网站http://fir.im的注册与常用功能
330 0
ios和安卓测试包发布网站http://fir.im的注册与常用功能