Android 4.4(KitKat)で通話を切断する作業コードがあります。 私は
How to programmatically answer/end a call in Android 4.1?とAndroid:Android 5.0以降の通話をブロック(または切断)する方法
How can incoming calls be answered programmatically in Android 5.0 (Lollipop)?で記述された「サービスコール電話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());
}
}
});
を次のように
完全なコードスニペットです.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
Iは、1つの以上の許可
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
着信PhoneStateListenerから延び、私は方法をlogcatから
@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());
}
}
});
}
をオーバーライド検出するクラスを追加したI上記のコードから出力している出力文を通知する(したがって、サービスコールされています)が、私のコールは切断されることはありません。私はそれをmarshmallow(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
あなたが最後に解決策を見つけるか/ 6.0へのAndroid 5.0からの着信に答えますか? – Jame