Как завершить звонок, встряхнув телефон
Я занимаюсь 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;
}
заранее спасибо
1 ответ
Я попробовал несколько трюков, чтобы отправить клики по окончанию звонка, но ни один не помог.
однако, основываясь на этой ссылке и этой ссылке, следующий код вызовет зависание телефонного звонка, хотя я отношусь к этому как к хаку:
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();
}
РЕДАКТИРОВАТЬ: Этот код не работает на всех устройствах и версиях Android (Пример Nexus 5x с Android 8.1). Единственное безопасное решение - использовать официальный API, который, к сожалению, доступен на Android P. Я писал об этом здесь.