2016-09-16 16 views
6

Androidの上位バージョンでコールスルーコードを切断する必要があります。アンドロイドでプログラムで切断するMarshmallowのバージョン

文書ごとに私たちは非公開であるため、許可されていません。

SOを検索しているうちに、私はロリポップまでさまざまな解決策を見つけました。

インラインは今まで私が試したアプローチです。

1つのアプローチ:

public void disconnectCall(String type){ 
     try { 
      String serviceManagerName = "android.os.ServiceManager"; 
      String serviceManagerNativeName = "android.os.ServiceManagerNative"; 
      String telephonyName = "com.android.internal.telephony.ITelephony"; 
      Class<?> telephonyClass; 
      Class<?> telephonyStubClass; 
      Class<?> serviceManagerClass; 
      Class<?> serviceManagerNativeClass; 
      Method telephonyEndCall; 
      Object telephonyObject; 
      Object serviceManagerObject; 
      telephonyClass = Class.forName(telephonyName); 
      telephonyStubClass = telephonyClass.getClasses()[0]; 
      serviceManagerClass = Class.forName(serviceManagerName); 
      serviceManagerNativeClass = Class.forName(serviceManagerNativeName); 
      Method getService = // getDefaults[29]; 
        serviceManagerClass.getMethod("getService", String.class); 
      Method tempInterfaceMethod = serviceManagerNativeClass.getMethod("asInterface", IBinder.class); 
      Binder tmpBinder = new Binder(); 
      tmpBinder.attachInterface(null, "fake"); 
      serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder); 
      IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone"); 
      Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class); 
      telephonyObject = serviceMethod.invoke(null, retbinder); 
      telephonyEndCall = telephonyClass.getMethod("endCall"); 
      telephonyEndCall.invoke(telephonyObject); 

      // Reject call and send SMS 
      if (type.equalsIgnoreCase("reject")) { 
       SmsManager smsManager = SmsManager.getDefault(); 
       smsManager.sendTextMessage(_incomingNumber, null, "Hey! I am driving right now. Please call me back after some time", null, null); 
       Toast.makeText(context, "CALL REJECTED", Toast.LENGTH_SHORT).show(); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

アプローチ2:

public boolean killCall(Context context) { 
     try { 
      // Get the boring old TelephonyManager 
      TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 

      // Get the getITelephony() method 
      Class classTelephony = Class.forName(telephonyManager.getClass().getName()); 
      Method methodGetITelephony = classTelephony.getDeclaredMethod("getITelephony"); 

      // Ignore that the method is supposed to be private 
      methodGetITelephony.setAccessible(true); 

      // Invoke getITelephony() to get the ITelephony interface 
      Object telephonyInterface = methodGetITelephony.invoke(telephonyManager); 

      // Get the endCall method from ITelephony 
      Class telephonyInterfaceClass = Class.forName(telephonyInterface.getClass().getName()); 
      Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("endCall"); 

      // Invoke endCall() 
      methodEndCall.invoke(telephonyInterface); 

     } catch (Exception ex) { // Many things can go wrong with reflection calls 
      return false; 
     } 
     return true; 
    } 

アプローチ3:

public void endCall(Context context) { 
     TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
     try { 
      Class c = Class.forName(tm.getClass().getName()); 
      Method m = c.getDeclaredMethod("getITelephony"); 
      m.setAccessible(true); 
      Object telephonyService = m.invoke(tm); 

      c = Class.forName(telephonyService.getClass().getName()); 
      m = c.getDeclaredMethod("endCall"); 
      m.setAccessible(true); 
      m.invoke(telephonyService); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

答えて

6

メントの上私はちょうど、アンドロイドのM +バージョンのためのCALL_PHONEの実行時許可を追加するために外に出ています。

フォローインラインは言及:

は、Androidマニフェストファイルにアクセス権を定義します。

<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission> 
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 

は今M +アンドロイドのバージョンのランタイム許可を取得します。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
     { 

      if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) 
      { 
       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, PERMISSION_ACCESS_CALL_PHONE); 
      } 
      else 
      { 
       // Proceed as we already have permission. 
      } 
     } 
     else 
     { 
      // Proceed as we need not get the permission 
     } 


@Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case PERMISSION_ACCESS_CALL_PHONE: 
       if (grantResults.length > 0 && grantResults[0] PackageManager.PERMISSION_GRANTED) { 
        // All good! 

        //Toast.makeText(context, "All Good", Toast.LENGTH_SHORT).show(); 
       } else { 
        finish(); 
        //Toast.makeText(this, "Need call phone permission", Toast.LENGTH_SHORT).show(); 
       } 

       break; 
     } 
    } 

今すぐプロ文法的に通話を切断するインラインメソッドを使用します。

private void declinePhone(Context context) throws Exception { 

     try { 

      String serviceManagerName = "android.os.ServiceManager"; 
      String serviceManagerNativeName = "android.os.ServiceManagerNative"; 
      String telephonyName = "com.android.internal.telephony.ITelephony"; 
      Class<?> telephonyClass; 
      Class<?> telephonyStubClass; 
      Class<?> serviceManagerClass; 
      Class<?> serviceManagerNativeClass; 
      Method telephonyEndCall; 
      Object telephonyObject; 
      Object serviceManagerObject; 
      telephonyClass = Class.forName(telephonyName); 
      telephonyStubClass = telephonyClass.getClasses()[0]; 
      serviceManagerClass = Class.forName(serviceManagerName); 
      serviceManagerNativeClass = Class.forName(serviceManagerNativeName); 
      Method getService = // getDefaults[29]; 
      serviceManagerClass.getMethod("getService", String.class); 
      Method tempInterfaceMethod = serviceManagerNativeClass.getMethod("asInterface", IBinder.class); 
      Binder tmpBinder = new Binder(); 
      tmpBinder.attachInterface(null, "fake"); 
      serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder); 
      IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone"); 
      Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class); 
      telephonyObject = serviceMethod.invoke(null, retbinder); 
      telephonyEndCall = telephonyClass.getMethod("endCall"); 
      telephonyEndCall.invoke(telephonyObject); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.d("unable", "msg cant dissconect call...."); 

     } 

これだけです!準備できた。

乾杯!

+0

ありがとうございます!これはMMの場合でも有効な解決策です –

関連する問題