2016-07-05 11 views
1

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()); 
      } 
     } 
    }); 


} 
} 
+0

はあなたのコードが正しいかもしれ追加します。あなたはマシュマロでランタイム許可を与えましたか? –

+0

コードと権限で私の投稿を編集しました。それ以上のアクセス許可が必要ですか? – mobileDev

+0

あなたが最後に解決策を見つけるか/ 6.0へのAndroid 5.0からの着信に答えますか? – Jame

答えて

1

Iは、ドキュメントを検索しMODIFY_PHONE_STATEのみシステムアプリケーションのためのものであることを見出しました。 Protected permissions。あなたがこれを必要としない着信呼を検出するために少なくともatleast。これらのすべての権限をマニフェストに追加する必要があります。

<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"/> 

また、Marshmallowで作業している場合は、実行時にこれらのアクセス許可も付与する必要があります。このような。 onCreate

/// granting permission //// 
    if(!checkPermission()) 
    { 
     requestPermission(); 
    } 
///////////////////////////// 

でこれを入れて、クラスでこれら

/////////////////////// permission for marshmallow /////////////////// 

private boolean checkPermission(){ 
    int result1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE); 
    int result3 = ContextCompat.checkSelfPermission(this, Manifest.permission.PROCESS_OUTGOING_CALLS); 
    int result4 = ContextCompat.checkSelfPermission(this, Manifest.permission.PROCESS_INCOMING_CALLS); 
    int result5 = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE); 

    if (result1 == PackageManager.PERMISSION_GRANTED && result3 == PackageManager.PERMISSION_GRANTED && result4 == PackageManager.PERMISSION_GRANTED 
      && result5 == PackageManager.PERMISSION_GRANTED){ 

     return true; 

    } else { 

     //Toast.makeText(this,"You don't have permission to use further features",Toast.LENGTH_LONG).show(); 
     return false; 

    } 
} 

private void requestPermission(){ 

    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_PHONE_STATE) && 
      ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.PROCESS_OUTGOING_CALLS) && 
      ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.PROCESS_INCOMING_CALLS) && 
        ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)){ 

     Toast.makeText(this,"Application needs permission to use your camera, calls, storage and location.",Toast.LENGTH_LONG).show(); 

    } else { 

     ActivityCompat.requestPermissions(this,new String[{Manifest.permission.READ_PHONE_STATE,Manifest.permission.PROCESS_OUTGOING_CALLS, 
       Manifest.permission.PROCESS_INCOMING_CALLS, Manifest.permission.CALL_PHONE},1); 

    } 
} 


@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case 1: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && 
        grantResults[1] == PackageManager.PERMISSION_GRANTED && 
        grantResults[2] == PackageManager.PERMISSION_GRANTED && 
        grantResults[3] == PackageManager.PERMISSION_GRANTED) { 

       Toast.makeText(this,"Permission Granted.",Toast.LENGTH_LONG).show(); 

      } else { 

       Toast.makeText(this,"Permission Denied.",Toast.LENGTH_LONG).show(); 

      } 
      break; 
    } 
} 

//////////////////////////////////////////////////////////////////////// 
+0

MODIFY_PHONE_STATEを追加しましたが、まだ進捗状況はありませんでした(EDIT2の内容で私の質問を編集しました)。 「実行時のアクセス許可」に関するご意見をお聞かせください。 – mobileDev

+0

これらのアクセス許可は危険とみなされます。したがって、マシュマロでは、実行時にすべての危険な許可を要求する必要があります。または動的に言う。インストール後に一度だけ尋ねられます。これに関してインターネットには多くの参考文献とコードがあります。 Plsはそれをチェックします。 –

+0

が主な活動で\t http://www.journaldev.com/10409/android-handling-runtime-permissions-exampleチェック権限を参照してください。アプリに権限リクエストのパーミッションがない場合。 –

関連する問題