Android双卡打电话和发短信
一、打电话
首先需要申请电话信息权限,AndroidManifest.xml权限配置如下所示。
1 <!-- 打电话的权限 --> 2 <uses-permission android:name="android.permission.CALL_PHONE"/> 3 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Android5.1及以前版本只需要在AndroidManifest.xml中配置完权限后就可以进行打电话,打电话方式如下:
Intent intent = new Intent(Intent.ACTION_CALL);//android.intent.action.CALL
//2). 携带数据
String number = et_main_number.getText().toString();
intent.setData(Uri.parse("tel:"+number));
//3). startActivity(intent)
startActivity(intent);对于Android5.1以后的版本,除了AndroidManifest.xml权限配置以外,还需要通过用户允许获取权限,代码如下所示:
//检测用户是否同意权限
private void checkPermission(int id) {
//判断所申请的权限是不是已经通过,没通过返回false,通过返回true,则提示出来并拨打电话
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
//申请权限回调函数
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, PERMISSION_REQUEST_CODE);
} else {
Toast.makeText(this, "权限已被申请通过咯!", Toast.LENGTH_SHORT).show();
call(id);
}
}
//权限申请回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case PERMISSION_REQUEST_CODE:
//同意申请的权限
if (grantResults.length>0&&grantResults[0]== PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,"同意通过",Toast.LENGTH_SHORT).show();
// call();
//拒绝申请的权限
}else{
Toast.makeText(this,"拒绝通过",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}获取到电话权限后,可以使用以下代码进行双卡选择打电话,id为0表示卡一,id为1表示卡二,适用于Android5.1以后的方法,代码如下:
package com.example.phone;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.List;
public class MainActivity extends Activity {
private static final int PERMISSION_REQUEST_CODE = 1;
private EditText et_main_number;
private Button btn_main_call1;
private Button btn_main_call2;
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if(v==btn_main_call1){
checkPermission(0);
}
else if(v==btn_main_call2){
checkPermission(1);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化视图对象
et_main_number = (EditText) findViewById(R.id.et_main_number);
btn_main_call1 = (Button) findViewById(R.id.btn_main_call1);
btn_main_call2 = (Button) findViewById(R.id.btn_main_call2);
//给视图对象设置点击监听
btn_main_call1.setOnClickListener(onClickListener);
btn_main_call2.setOnClickListener(onClickListener);
}
//检测用户是否同意权限
private void checkPermission(int id) {
//判断所申请的权限是不是已经通过,没通过返回false,通过返回true,则提示出来并拨打电话
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
//申请权限回调函数
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, PERMISSION_REQUEST_CODE);
} else {
Toast.makeText(this, "权限已被申请通过咯!", Toast.LENGTH_SHORT).show();
call(id);
}
}
private void call(int id) {
Intent intent = new Intent(Intent.ACTION_CALL).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//android.intent.action.CALL
//2). 携带数据
String number = et_main_number.getText().toString();
intent.setData(Uri.parse("tel:" + number));
TelecomManager telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
List<PhoneAccountHandle> phoneAccountHandleList = telecomManager.getCallCapablePhoneAccounts();
intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,phoneAccountHandleList.get(id));
//3). startActivity(intent)
startActivity(intent);
}
//权限申请回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case PERMISSION_REQUEST_CODE:
//同意申请的权限
if (grantResults.length>0&&grantResults[0]== PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,"同意通过",Toast.LENGTH_SHORT).show();
// call();
//拒绝申请的权限
}else{
Toast.makeText(this,"拒绝通过",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
}activity_main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电话号码: " />
<EditText
android:id="@+id/et_main_number"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="请输入号码">
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btn_main_call1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="卡1" />
<Button
android:id="@+id/btn_main_call2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="卡2" />
</LinearLayout>
</LinearLayout>完成以上操作,即可实现双卡选择打电话。
二、发短信
首先需要申请电话信息权限,AndroidManifest.xml权限配置如下所示。
1 <!-- 发短信的权限 --> 2 <uses-permission android:name="android.permission.SEND_SMS"/>
除了AndroidManifest.xml权限配置以外,还需要通过用户允许获取权限,代码如下所示:
//检测用户是否同意权限
private void checkPermission(int id) {
//判断所申请的权限是不是已经通过,没通过返回false,通过返回true,则提示出来并发送短信
if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
//申请权限回调函数
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, PERMISSION_REQUEST_CODE);
} else {
Toast.makeText(this, "权限已被申请通过咯!", Toast.LENGTH_SHORT).show();
message(id);
}
}
//权限申请回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case PERMISSION_REQUEST_CODE:
//同意申请的权限
if (grantResults.length>0&&grantResults[0]== PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,"同意通过",Toast.LENGTH_SHORT).show();
//拒绝申请的权限
}else{
Toast.makeText(this,"拒绝通过",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}获取到短信权限后,可以使用以下代码进行双卡选择打电话,id为0表示卡一,id为1表示卡二,代码如下:
package com.example.message;
import android.Manifest;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.telephony.SmsManager;
import android.telephony.SubscriptionManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MainActivity extends Activity{
private static final int PERMISSION_REQUEST_CODE = 1;
private EditText et_main_number;
private EditText et_main_sms;
private Button btn_main_send;
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if(v==btn_main_send) {
//id=0为卡一,id=1为卡二
checkPermission(0);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化视图对象
et_main_number = (EditText) findViewById(R.id.et_main_number);
et_main_sms = findViewById(R.id.et_main_sms);
btn_main_send = (Button) findViewById(R.id.btn_main_send);
//给视图对象设置点击监听
btn_main_send.setOnClickListener(onClickListener);
}
//检测用户是否同意权限
private void checkPermission(int id) {
//判断所申请的权限是不是已经通过,没通过返回false,通过返回true,则提示出来并拨打电话
if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
//申请权限回调函数
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, PERMISSION_REQUEST_CODE);
} else {
Toast.makeText(this, "权限已被申请通过咯!", Toast.LENGTH_SHORT).show();
message(id);
}
}
private void message(int id) {
SubscriptionManager smanager = (SubscriptionManager) getSystemService(TELEPHONY_SUBSCRIPTION_SERVICE);
Class sclazz = smanager.getClass();
Method getSubId = null;
try {
getSubId = sclazz.getDeclaredMethod("getSubId",int.class);
}catch (NoSuchMethodException e){
e.printStackTrace();
}
int[] ints = new int[1];
try {
ints = (int[])getSubId.invoke(smanager,id);
}catch (IllegalAccessException e){
e.printStackTrace();
}catch (InvocationTargetException e){
e.printStackTrace();
}
SmsManager smsManager = SmsManager.getSmsManagerForSubscriptionId(ints[0]);
PendingIntent sentIntent = PendingIntent.getBroadcast(this,0, new Intent(Context.TELEPHONY_SUBSCRIPTION_SERVICE),PendingIntent.FLAG_ONE_SHOT);
String number = et_main_number.getText().toString();
String sms = et_main_sms.getText().toString();
smsManager.sendTextMessage(number,null,sms,sentIntent,null);
}
//权限申请回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case PERMISSION_REQUEST_CODE:
//同意申请的权限
if (grantResults.length>0&&grantResults[0]== PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,"同意通过",Toast.LENGTH_SHORT).show();
//拒绝申请的权限
}else{
Toast.makeText(this,"拒绝通过",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
}activity_main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电话号码: " />
<EditText
android:id="@+id/et_main_number"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入号码">
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="短信内容: " />
<EditText
android:id="@+id/et_main_sms"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入短信">
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/btn_main_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发短信" />
</LinearLayout>
</LinearLayout>完成以上操作后,即可实现双卡选择发送短信。
相关推荐
fengyeezju 2020-06-25
安辉 2020-03-01
xilove0 2020-02-01
Roka 2019-12-14
GoAheadY 2010-08-21
sgafdsg 2011-07-19
小仙儿 2019-10-22
我只是个程序员 2014-07-01
taiyuanwuyin 2015-03-31
未子涵 2019-09-21
FreeThinking 2019-04-16
ajaxtony 2018-12-10
tzshlyt 2019-08-20
屋顶小黑猫 2012-09-21
冰川孤辰 2019-07-01
Jemy杰 2019-07-01
mislyvinky 2019-06-29