Android系統(tǒng)中調(diào)用電話和短信功能的實現(xiàn)方法
前言
- 本文將聚焦系統(tǒng)級功能調(diào)用——打電話與發(fā)短信。這兩個功能是移動應(yīng)用的核心基礎(chǔ)能力,本質(zhì)是通過
Intent(意圖)喚醒Android系統(tǒng)自帶的電話/短信應(yīng)用,實現(xiàn)跨應(yīng)用交互。 - 對于后端開發(fā)者,系統(tǒng)功能調(diào)用可類比“后端接口調(diào)用第三方服務(wù)”(如調(diào)用短信平臺API、支付接口):
Intent相當(dāng)于“請求參數(shù)”,系統(tǒng)應(yīng)用相當(dāng)于“第三方服務(wù)”,權(quán)限申請相當(dāng)于“接口調(diào)用授權(quán)”,整個流程遵循“請求→授權(quán)→執(zhí)行”的邏輯。
一、Intent與系統(tǒng)權(quán)限
調(diào)用系統(tǒng)功能的核心是Intent的“隱式意圖”(無需指定具體Activity,只聲明動作和數(shù)據(jù)),再配合Android的“權(quán)限機制”(保護用戶隱私,需明確申請敏感權(quán)限)。
1.1 隱式意圖
隱式意圖不直接指定目標(biāo)組件(如系統(tǒng)電話應(yīng)用的Activity),而是通過Action(動作)和Data(數(shù)據(jù))描述“要做什么”,由Android系統(tǒng)匹配對應(yīng)的系統(tǒng)應(yīng)用來執(zhí)行。
| 核心要素 | 作用 | 示例(打電話) |
|---|---|---|
Action | 聲明要執(zhí)行的動作(如打電話、發(fā)短信) | Intent.ACTION_CALL(直接撥號) |
Data | 傳遞動作所需的數(shù)據(jù)(如電話號碼、收件人) | Uri.parse("tel:666666")(目標(biāo)號碼) |
1.2 系統(tǒng)權(quán)限機制
打電話、發(fā)短信屬于“敏感權(quán)限”(涉及用戶通信隱私和費用),Android 6.0(API 23)及以上版本要求動態(tài)申請權(quán)限(僅在Manifest中聲明不夠,需在代碼中彈窗詢問用戶授權(quán))。
| 權(quán)限類型 | 聲明方式 | 適用場景 |
|---|---|---|
| 靜態(tài)權(quán)限 | 在AndroidManifest.xml中聲明 | 低風(fēng)險功能(如訪問網(wǎng)絡(luò)、讀取外部存儲) |
| 動態(tài)權(quán)限 | 代碼中申請+用戶手動授權(quán) | 高風(fēng)險功能(如打電話、發(fā)短信、獲取位置) |
二、實戰(zhàn)一:打電話功能實現(xiàn)(兩種方式)
打電話有兩種常用實現(xiàn)方式:直接撥號(無需用戶確認(rèn),需危險權(quán)限)和跳轉(zhuǎn)到撥號盤(用戶手動點擊撥打,需普通權(quán)限),可根據(jù)場景選擇。
2.1 方式一:直接撥號(ACTION_CALL)
直接喚醒系統(tǒng)電話應(yīng)用并撥打指定號碼,無需用戶額外操作,但需申請CALL_PHONE危險權(quán)限。
2.1.1 步驟1:聲明靜態(tài)權(quán)限(AndroidManifest.xml)
在manifests/AndroidManifest.xml中添加權(quán)限聲明(放在<application>標(biāo)簽外):
<!-- 打電話權(quán)限(危險權(quán)限) --> <uses-permission android:name="android.permission.CALL_PHONE" />
2.1.2 步驟2:代碼實現(xiàn)
以下是完整實現(xiàn)(含動態(tài)權(quán)限申請):
public class MainActivity extends AppCompatActivity {
// 權(quán)限請求碼(自定義,需唯一)
private static final int REQUEST_CALL_PERMISSION = 100;
private Button callBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化按鈕
callBtn = findViewById(R.id.call);
callBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phoneNum = "666666"; // 目標(biāo)電話號碼
// 1. 檢查是否已獲得權(quán)限
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
// 2. 權(quán)限已授權(quán),執(zhí)行打電話邏輯
callPhoneDirect(phoneNum);
} else {
// 3. 未授權(quán),申請動態(tài)權(quán)限(彈窗詢問用戶)
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CALL_PHONE},
REQUEST_CALL_PERMISSION);
}
}
});
}
// 直接撥號核心邏輯
private void callPhoneDirect(String phoneNum) {
Intent intent = new Intent(Intent.ACTION_CALL);
// 設(shè)置電話號碼(tel:是固定協(xié)議,不能省略)
intent.setData(Uri.parse("tel:" + phoneNum));
startActivity(intent);
}
// 監(jiān)聽權(quán)限申請結(jié)果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CALL_PERMISSION) {
// 用戶同意授權(quán)
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
callPhoneDirect("666666");
} else {
// 用戶拒絕授權(quán),提示無法使用功能
Toast.makeText(this, "未授權(quán)打電話權(quán)限,功能無法使用", Toast.LENGTH_SHORT).show();
}
}
}
}
2.2 方式二:跳轉(zhuǎn)到撥號盤(ACTION_DIAL)
僅打開系統(tǒng)撥號盤并填充號碼,需用戶手動點擊“撥打”按鈕,無需動態(tài)權(quán)限(僅需靜態(tài)聲明,甚至可省略),更安全。
2.2.1 代碼實現(xiàn)(無需動態(tài)權(quán)限)
// 按鈕點擊事件中直接執(zhí)行
callBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phoneNum = "666666";
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:" + phoneNum));
startActivity(intent);
}
});
2.2.2 兩種方式對比表
| 實現(xiàn)方式 | 核心Action | 權(quán)限要求 | 優(yōu)點 | 缺點 |
|---|---|---|---|---|
| 直接撥號 | Intent.ACTION_CALL | 動態(tài)申請CALL_PHONE權(quán)限 | 操作便捷,無需用戶額外點擊 | 風(fēng)險高(誤觸會產(chǎn)生費用),需處理權(quán)限 |
| 跳轉(zhuǎn)撥號盤 | Intent.ACTION_DIAL | 無需動態(tài)權(quán)限(靜態(tài)聲明可選) | 安全(用戶確認(rèn)后撥打),無權(quán)限風(fēng)險 | 多一步用戶操作 |
三、實戰(zhàn)二:發(fā)短信功能實現(xiàn)
發(fā)短信功能通過ACTION_SENDTO指定收件人,配合.putExtra("sms_body")傳遞默認(rèn)短信內(nèi)容,用戶可修改后發(fā)送,權(quán)限要求低于打電話。
3.1 步驟1:聲明靜態(tài)權(quán)限
發(fā)短信的SEND_SMS權(quán)限屬于危險權(quán)限,但ACTION_SENDTO方式會跳轉(zhuǎn)到系統(tǒng)短信應(yīng)用,由系統(tǒng)應(yīng)用執(zhí)行發(fā)送操作,無需申請動態(tài)權(quán)限(僅需在Manifest中聲明靜態(tài)權(quán)限,部分設(shè)備可不聲明):
<!-- 發(fā)短信權(quán)限(靜態(tài)聲明即可,無需動態(tài)申請) --> <uses-permission android:name="android.permission.SEND_SMS" />
3.2 步驟2:代碼實現(xiàn)
Button smsBtn = findViewById(R.id.sms);
smsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String phoneNum = "10086"; // 收件人號碼
String smsContent = "java1"; // 默認(rèn)短信內(nèi)容
// 1. 創(chuàng)建隱式意圖,指定動作:發(fā)送短信
Intent intent = new Intent(Intent.ACTION_SENDTO);
// 2. 設(shè)置收件人(smsto:是固定協(xié)議,不能省略)
intent.setData(Uri.parse("smsto:" + phoneNum));
// 3. 傳遞默認(rèn)短信內(nèi)容(key固定為"sms_body")
intent.putExtra("sms_body", smsContent);
// 4. 啟動系統(tǒng)短信應(yīng)用
startActivity(intent);
}
});
點擊“發(fā)短信”按鈕后,會自動打開系統(tǒng)短信應(yīng)用:
- 收件人已填充為“10086”;
- 短信內(nèi)容已填充為“java1”;
- 用戶可修改號碼或內(nèi)容,點擊發(fā)送即可。
3.4 關(guān)鍵注意事項
- 協(xié)議格式:
smsto:不能省略,否則系統(tǒng)無法識別是“發(fā)送短信”動作,可能跳轉(zhuǎn)錯誤應(yīng)用。 - 內(nèi)容傳遞:必須使用
intent.putExtra("sms_body", 內(nèi)容),key固定為sms_body(系統(tǒng)短信應(yīng)用只識別該key)。 - 權(quán)限說明:若直接使用
SmsManager類發(fā)送短信(不跳轉(zhuǎn)到系統(tǒng)應(yīng)用),則需動態(tài)申請SEND_SMS權(quán)限,推薦新手使用跳轉(zhuǎn)到系統(tǒng)應(yīng)用的方式(簡單且安全)。
到此這篇關(guān)于Android系統(tǒng)中調(diào)用電話和短信功能的實現(xiàn)方法的文章就介紹到這了,更多相關(guān)Android調(diào)用電話和短信功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android編程實現(xiàn)google消息通知功能示例
這篇文章主要介紹了Android編程實現(xiàn)google消息通知功能,結(jié)合具體實例形式分析了Android消息處理及C#服務(wù)器端與google交互的相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
一行代碼教你解決Scrollview和TextInput焦點獲取問題
這篇文章主要為大家介紹了一行代碼教你解決Scrollview和TextInput焦點獲取問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
Android實戰(zhàn)打飛機游戲之菜單頁面設(shè)計(1)
這篇文章主要為大家詳細(xì)介紹了Android實戰(zhàn)打飛機游戲之菜單頁面設(shè)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-07-07
Android通過ExifInterface判斷Camera圖片方向的方法
今天小編就為大家分享一篇關(guān)于Android通過ExifInterface判斷相機圖片朝向的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
Android基于OpenGL的GLSurfaceView創(chuàng)建一個Activity實現(xiàn)方法
這篇文章主要介紹了Android基于OpenGL的GLSurfaceView創(chuàng)建一個Activity實現(xiàn)方法,結(jié)合實例形式分析了Android中OpenGL圖形操作類GLSurfaceView的功能、用法及相關(guān)使用技巧,需要的朋友可以參考下2016-10-10
Android?debug包運行正常release包崩潰的解決辦法
這篇文章主要介紹了Android?debug包運行正常,release包崩潰解決辦法,文中通過代碼示例介紹的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下2024-04-04

