[英]End call in android programmatically
我看到很多問題,在 Android 中以編程方式結束呼叫是不可能的。 同時,我在 googleplay 市場上看到很多撥號應用程序,您可以在其中激活呼叫和掛斷電話。 它們是如何工作的?
編輯:我在某處讀到我的應用程序必須是系統應用程序。 那么如何讓它系統化,系統應用和用戶應用有什么區別呢?
您無需成為系統應用程序。 首先,在您的項目中創建包com.android.internal.telephony
,並將其放入名為“ ITelephony.aidl
”的文件中:
package com.android.internal.telephony;
interface ITelephony {
boolean endCall();
void answerRingingCall();
void silenceRinger();
}
完成后,您可以使用此代碼結束通話:
TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
Class clazz = Class.forName(telephonyManager.getClass().getName());
Method method = clazz.getDeclaredMethod("getITelephony");
method.setAccessible(true);
ITelephony telephonyService = (ITelephony) method.invoke(telephonyManager);
telephonyService.endCall();
例如,您可以在 PhoneStateListener 中使用它。 為此,您需要清單中的權限:
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
編輯:對可怕的格式表示歉意,我仍然無法弄清楚如何在這里正確地執行代碼塊:/
對於 Android P(自 Beta 2 起)及以上版本,終於有了 endCall 的正式 API:
https://developer.android.com/reference/android/telecom/TelecomManager#endCall()
清單中需要ANSWER_PHONE_CALLS
權限:
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
經許可,API level 28及以上:
TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
if (tm != null) {
boolean success = tm.endCall();
// success == true if call was terminated.
}
同時,原有的endCall()
在方法TelephonyManager
現在被保護MODIFY_PHONE_STATE
權限,可以不再受非系統應用未經允許的(否則安全異常將被觸發)來調用通過反射。
切斷調用 Api 28+
private void cutCall(){
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.READ_PHONE_STATE }, PHONE_STATE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (requestCode == PHONE_STATE) {
ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.ANSWER_PHONE_CALLS }, ANSWER_CALLS);
} else if (requestCode == ANSWER_CALLS) {
cutTheCall;
}
}
}
//此代碼適用於Android N(Api 28及以上)
private boolean cutTheCall() {
TelecomManager telecomManager = (TelecomManager) getApplicationContext().getSystemService(TELECOM_SERVICE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED || telecomManager == null) {
return false;
}
if (telecomManager.isInCall()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
callDisconnected = telecomManager.endCall();
}
}
return true;
}
除了添加 android 電話接口和廣播接收器外,您還需要為要處理意圖的接收器添加帶有操作android.intent.action.PHONE_STATE
android 清單接收器條目。
如果添加,則會出現編譯時錯誤
uses-permission android:name="android.permission.MODIFY_PHONE_STATE`
在您的清單文件中。 但即使我們刪除它,它也會自動拒絕來電。
信息。
在某些情況下可能有用。 使用InCallService
類有一個潛在的解決方法。 大多數必需的信息都在這里。 https://developer.android.com/reference/android/telecom/InCallService.html#onCallRemoved(android.telecom.Call)
它確實需要將您的應用程序設置為默認電話應用程序並確保授予以下權限。
<uses-permission android:name="android.permission.CALL_PHONE" />
如果您實現自己的擴展InCallService
的類,那么當呼叫開始時,呼叫將綁定到您的應用程序,您可以通過onCallAdded()
函數獲取呼叫信息。 然后您可以簡單地call.disconnect()
並且呼叫將結束。
SilenceRinger()
不適用於 android 2.3+ 版本。 只需評論它,其他代碼就可以正常工作。 希望這對你有用!
public static boolean isCallActive(Context context){
AudioManager manager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
if(manager.getMode()==AudioManager.MODE_IN_CALL || manager.getMode()==AudioManager.MODE_IN_COMMUNICATION){
return true;
}
return false;
}
只是為了添加到@headuck 的答案。 對於 API 28,您還需要添加:
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
然后在您的活動中請求許可。 我總共請求了這些權限以使其工作(READ_PHONE_STATE、CALL_PHONE、ANSWER_PHONE_CALLS、READ_CONTACTS、READ_CALL_LOG)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.