Android 如何通过摇晃手机结束通话

Android 如何通过摇晃手机结束通话,android,handshaking,Android,Handshaking,我正在做一个Android应用程序,它可以让不同能力的人通过摇动手机拨打预定义的号码寻求帮助。我做了一个定制,当一个震动呼叫一个特定的号码。但是,我不知道: 我如何通过向同一方向摇晃来关闭呼叫? 双摇如何去接另一个电话等 public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER || event.values.length < 2

我正在做一个Android应用程序,它可以让不同能力的人通过摇动手机拨打预定义的号码寻求帮助。我做了一个定制,当一个震动呼叫一个特定的号码。但是,我不知道:

我如何通过向同一方向摇晃来关闭呼叫? 双摇如何去接另一个电话等

public void onSensorChanged(SensorEvent event) {

    if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER || event.values.length < 2)
          return;

    currentTime = System.currentTimeMillis();

    if ((currentTime - lastUpdate) > 100) {
        long diffTime = (currentTime - lastUpdate);
        lastUpdate = currentTime;

        current_x = event.values[DATA_X];
        current_y = event.values[DATA_Y];
        current_z = event.values[DATA_Z];

        currenForce = Math.abs(current_x+current_y+current_z - last_x - last_y - last_z) / diffTime * 10000;

        if (currenForce > FORCE_THRESHOLD && inCall ==0) {


            if (sp.contains("number") && sp.getString("number","").length() > 5 ){

            // Device has been shaken now go on and do something
            // you could now inform the parent activity ...
            String phoneNumber = sp.getString("Number", "1800");
            android.net.Uri uri = android.net.Uri.fromParts("tel", phoneNumber, null);


            try{
            inCall =1;  
            android.content.Intent callIntent = new android.content.Intent(android.content.Intent.ACTION_CALL, uri);
            callIntent.setFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(callIntent);
            }catch(Exception e){
                inCall =0;
                e.printStackTrace();
            }

            }else{
                Toast.makeText(this, "Please Configure number first", Toast.LENGTH_LONG);
            }



        }else{

             try{   
                 Toast.makeText(getBaseContext(), "Trying to End Call", Toast.LENGTH_LONG);
                 // Send Key For End Call
                 new KeyEvent(KeyEvent.ACTION_DOWN,
                       KeyEvent.KEYCODE_ENDCALL );

                 inCall =0;
             }catch(Exception e){

                 e.printStackTrace();
             }

        }

        last_x = current_x;
        last_y = current_y;
        last_z = current_z;

    }
传感器更改时的公共无效(传感器事件){ if(event.sensor.getType()!=sensor.TYPE|加速计| event.values.length<2) 返回; currentTime=System.currentTimeMillis(); 如果((当前时间-上次更新)>100){ long diffTime=(currentTime-lastUpdate); lastUpdate=当前时间; 当前_x=事件值[数据_x]; 当前值=事件值[数据值]; 当前值=事件值[数据值]; currenForce=Math.abs(current_x+current_y+current_z-last_x-last_y-last_z)/diffTime*10000; 如果(currenForce>FORCE_THRESHOLD&&inCall==0){ if(sp.contains(“number”)和&sp.getString(“number”),长度()>5){ //设备已经震动了,现在继续做点什么 //您现在可以通知父活动。。。 String phoneNumber=sp.getString(“Number”,“1800”); android.net.Uri=android.net.Uri.fromParts(“tel”,电话号码,空); 试一试{ inCall=1; android.content.Intent callIntent=新的android.content.Intent(android.content.Intent.ACTION\u调用,uri); setFlags(android.content.Intent.FLAG\u活动\u新任务); 星触觉; }捕获(例外e){ inCall=0; e、 printStackTrace(); } }否则{ Toast.makeText(这是“请先配置数字”,Toast.LENGTH\u LONG); } }否则{ 试试{ Toast.makeText(getBaseContext(),“尝试结束调用”,Toast.LENGTH\u LONG); //发送结束呼叫的密钥 新的KeyEvent(KeyEvent.ACTION\u向下, KeyEvent.KEYCODE_ENDCALL); inCall=0; }捕获(例外e){ e、 printStackTrace(); } } last_x=当前_x; last_y=当前_y; last_z=当前_z; }
提前感谢

我尝试了一些技巧来发送结束通话的点击,但都没有成功

然而,基于和,下一个代码将导致电话挂起,尽管我将其视为黑客行为:

try {
final String serviceManagerName = "android.os.ServiceManager";
final String serviceManagerNativeName = "android.os.ServiceManagerNative";
final 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);

final Method getService = serviceManagerClass.getMethod("getService", String.class);

final Method tempInterfaceMethod = serviceManagerNativeClass.getMethod("asInterface", IBinder.class);

final Binder tmpBinder = new Binder();
tmpBinder.attachInterface(null, "fake");

serviceManagerObject = tempInterfaceMethod.invoke(null, tmpBinder);
final IBinder retbinder = (IBinder) getService.invoke(serviceManagerObject, "phone");
final Method serviceMethod = telephonyStubClass.getMethod("asInterface", IBinder.class);

telephonyObject = serviceMethod.invoke(null, retbinder);
// telephonyCall = telephonyClass.getMethod("call", String.class);
telephonyEndCall = telephonyClass.getMethod("endCall");
// telephonyAnswerCall = telephonyClass.getMethod("answerRingingCall");

telephonyEndCall.invoke(telephonyObject);

} catch (final Exception e) {
e.printStackTrace();
}
试试看{
最后一个字符串serviceManagerName=“android.os.ServiceManager”;
最后一个字符串serviceManagerNativeName=“android.os.serviceManagerActive”;
最终字符串telephonyName=“com.android.internal.telephony.ITelephony”;
类电话类;
类电话子类;
类serviceManagerClass;
类serviceManagerNativeClass;
方法电话呼叫;
对象电话对象;
对象服务管理对象;
telephonyClass=Class.forName(telephonyName);
TelephonySubclass=telephonyClass.getClasses()[0];
serviceManagerClass=Class.forName(serviceManagerName);
serviceManagerNativeClass=Class.forName(serviceManagerNativeName);
最后一个方法getService=serviceManagerClass.getMethod(“getService”,String.class);
最终方法tempInterfaceMethod=ServiceManagerActiveClass.getMethod(“asInterface”,IBinder.class);
最终粘合剂tmpBinder=新粘合剂();
tmpBinder.attachInterface(空,“假”);
serviceManagerObject=tempInterfaceMethod.invoke(null,tmpBinder);
最终IBinder retbinder=(IBinder)getService.invoke(serviceManagerObject,“电话”);
最终方法serviceMethod=telephonyStubClass.getMethod(“asInterface”,IBinder.class);
telephonyObject=serviceMethod.invoke(null,retbinder);
//telephoncall=telephonyClass.getMethod(“call”,String.class);
telephonyEndCall=telephonyClass.getMethod(“endCall”);
//telephonyAnswerCall=telephonyClass.getMethod(“应答呼叫”);
调用(telephonyObject);
}捕获(最终异常e){
e、 printStackTrace();
}

编辑:这段代码并不适用于所有的设备和Android版本(例如Nexus 5x和Android 8.1)。唯一安全的解决方案是使用官方API,这很遗憾可以从Android p获得。我写过这段代码