我有一個工作代碼,斷開Android 4.4(KitKat)上的呼叫。 我用,將其在
How to programmatically answer/end a call in Android 4.1?和How can incoming calls be answered programmatically in Android 5.0 (Lollipop)?Android:如何阻止(或斷開)Android 5.0+上的呼叫到6.0
描述「服務呼叫電話5」的技術,但這些代碼沒有斷開的6.0來電。我有一個後臺服務在後臺持續運行,並監控電話號碼列表,並選擇自動斷開這些號碼。
我如何以編程方式斷開的Nexus5和Android版本的來電6.0
EDIT1
完整的代碼片段如下
Executor eS = Executors.newSingleThreadExecutor();
eS.execute(new Runnable() {
@Override
public void run() {
Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("service call phone 5 \n");
} catch (Exception exc) {
Log.e("XX", exc.getMessage());
}
}
});
以下權限Android中定義.xml
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
EDIT2
我增加了一個許可
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
檢測呼入呼叫從PhoneStateListener延伸,並且我覆蓋的方法
@Override
public void onCallStateChanged(int state, String incomingNumber) {
Log.e("XX","*************IncomingPhoneStateListener........"+state+" incoming no:"+incomingNumber);
Executor eS = Executors.newSingleThreadExecutor();
eS.execute(new Runnable() {
@Override
public void run() {
Runtime runtime = Runtime.getRuntime();
try {
Log.e("XX", "*DISCONNECTING THE CALL* \n");
runtime.exec("service call phone 5 \n");
} catch (Exception exc) {
Log.e("XX", exc.getMessage());
}
}
});
}
從logcat中的類,我請注意我從上面的代碼打印輸出語句(因此服務被調用),但我的電話永遠不會斷開連接。我在棉花糖(nexus 5)上測試過它。
EDIT3
我在AndroidManifest.xml針對API 19。
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="19" />
EDIT4
這裏是我當前的代碼庫(修改sdkversion現在得到這整個事情的工作。我仍然didnt取得任何進展(同樣的老問題)
構建.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.XX.disconnectcall"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
private IncomingPhoneStateListener phoneStateListener;
public static final int PERMISSION_REQUEST_CODE = 1001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("TAG ","onCreate");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Log.e("TAG ","VERSION_CODES.M");
/* if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.READ_PHONE_STATE)
!= PackageManager.PERMISSION_GRANTED) {
*/
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_PHONE_STATE,Manifest.permission.MODIFY_PHONE_STATE,Manifest
.permission.CALL_PHONE,Manifest.permission.PROCESS_OUTGOING_CALLS},
PERMISSION_REQUEST_CODE);
// }
} else {
phoneStateListener = new IncomingPhoneStateListener();
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
TelephonyManager telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.e("TAG ","onRequestPermissionsResult");
boolean permissionBoolean = true;
if (requestCode == PERMISSION_REQUEST_CODE) {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
permissionBoolean = false;
}
}
if (permissionBoolean) {
phoneStateListener = new IncomingPhoneStateListener();
}
}
}
}
IncomingPhoneStateListener
public class IncomingPhoneStateListener extends PhoneStateListener {
int callState;
String callNumber;
public IncomingPhoneStateListener() {
super();
}
@Override
public void onCallStateChanged(int state, final String incomingNumber) {
callState = state;
callNumber = incomingNumber;
Log.e("TAG", "callState "+callState);
Executor eS = Executors.newSingleThreadExecutor();
eS.execute(new Runnable() {
@Override
public void run() {
Runtime runtime = Runtime.getRuntime();
try {
Log.e("TAG", "DISCONNECTING THE CALL From Number "+incomingNumber);
runtime.exec("service call phone 5 \n");
} catch (Exception exc) {
Log.e(" ", exc.getMessage());
}
}
});
}
}
可能是你的代碼是正確的。你有棉花糖運行許可嗎? –
用代碼和權限編輯我的帖子。我是否需要更多權限? – mobileDev
您是否找到解決方案來結束/回答從android 5.0到6.0的來電? – Jame