2016-09-16 69 views
6

我需要通过Android的高版本中的代码断开呼叫。以编程方式断开Android Marshmallow版本中的呼叫

根据文件我们没有被授权这样做,因为它是私人的。

通过搜索,我发现了不同的解决方案,直到棒棒糖。

内联是我迄今为止尝试的方法。

方法一:

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

方法二:

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

方法三:

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 +版本的Android添加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 +的android版本。

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的工作解决方案 –

相关问题