[英]Android call answering programmatically
是否可以以編程方式在android中接聽電話?
我發現了一些不可能的地方,但隨后安裝了應用程序https://play.google.com/store/apps/details?id=com.a0softus.autoanswer其工作正常。
我已經搜索了很多並嘗試了很多東西,而且來電拒絕工作正常,但來電接聽不起作用。
我已經嘗試了以下代碼來接聽電話,如下所示:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.KeyEvent;
import java.io.IOException;
import java.lang.reflect.Method;
import app.com.bikemode.MainActivity;
import app.com.bikemode.R;
public class IncomingCallReceiver extends BroadcastReceiver {
String incomingNumber = "";
AudioManager audioManager;
TelephonyManager telephonyManager;
Context context;
private MediaPlayer mediaPlayer;
public void onReceive(Context context, Intent intent) {
// Get AudioManager
this.context = context;
mediaPlayer = new MediaPlayer();
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
// Get TelephonyManager
telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (intent.getAction().equals("android.intent.action.PHONE_STATE")) {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
// Get incoming number
incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
}
}
if (!incomingNumber.equals("")) {
// Get an instance of ContentResolver
/* ContentResolver cr=context.getContentResolver();
// Fetch the matching number
Cursor numbers=cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID,ContactsContract.CommonDataKinds.Phone.NUMBER}, ContactsContract.CommonDataKinds.Phone.NUMBER +"=?", new String[]{incomingNumber}, null);
if(numbers.getCount()<=0){ // The incoming number is not found in the contacts list*/
// Turn on the mute
//audioManager.setStreamMute(AudioManager.STREAM_RING, true);
// Reject the call
//rejectCall();
// Send the rejected message ton app
//startApp(context,incomingNumber);
// }
//audioManager.setStreamMute(AudioManager.STREAM_RING, true);
//rejectCall();
//startApp(context, incomingNumber);
acceptCall();
}
}
private void startApp(Context context, String number) {
Intent intent = new Intent(context, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("number", "Rejected incoming number:" + number);
context.startActivity(intent);
}
private void rejectCall() {
try {
// Get the getITelephony() method
Class<?> classTelephony = Class.forName(telephonyManager.getClass().getName());
Method method = classTelephony.getDeclaredMethod("getITelephony");
// Disable access check
method.setAccessible(true);
// Invoke getITelephony() to get the ITelephony interface
Object telephonyInterface = method.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 e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void acceptCall() {
try {
/* // Get the getITelephony() method
Class<?> classTelephony = Class.forName(telephonyManager.getClass().getName());
Method method = classTelephony.getDeclaredMethod("getITelephony");
// Disable access check
method.setAccessible(true);
// Invoke getITelephony() to get the ITelephony interface
Object telephonyInterface = method.invoke(telephonyManager);
// Get the endCall method from ITelephony
Class<?> telephonyInterfaceClass = Class.forName(telephonyInterface.getClass().getName());
Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("answerRingingCall");
// Invoke endCall()
methodEndCall.invoke(telephonyInterface);*/
Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
buttonUp.putExtra(Intent.EXTRA_KEY_EVENT,
new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
context.sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED");
playAudio(R.raw.a);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void playAudio(int resid) {
AssetFileDescriptor afd = context.getResources().openRawResourceFd(resid);
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
mediaPlayer.prepare();
mediaPlayer.start();
afd.close();
} catch (IllegalArgumentException e) {
Log.w("Rahul Log",e.getMessage());
} catch (IllegalStateException e) {
Log.w("Rahul Log", e.getMessage());
} catch (IOException e) {
Log.w("Rahul Log", e.getMessage());
}
}
}
函數拒絕調用工作正常,但接受調用不起作用。
我的應用程序遇到了同樣的問題。 為接受來電設置一些延遲(~3000 毫秒)。 您還需要在不同的線程中調用acceptCall()
方法。
請參閱如何在 Android 5.0 (Lollipop) 中以編程方式接聽來電?
new Thread(new Runnable() {
@Override
public void run() {
acceptCall();
}
}).start();
private void acceptCall() {
try {
// Get the getITelephony() method
Class<?> classTelephony = Class.forName(telephonyManager.getClass().getName());
Method method = classTelephony.getDeclaredMethod("getITelephony");
// Disable access check
method.setAccessible(true);
// Invoke getITelephony() to get the ITelephony interface
Object telephonyInterface = method.invoke(telephonyManager);
// Get the endCall method from ITelephony
Class<?> telephonyInterfaceClass = Class.forName(telephonyInterface.getClass().getName());
Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("answerRingingCall");
// Invoke endCall()
methodEndCall.invoke(telephonyInterface);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
這對我有用。
private void answerCall() {
Log.d(TAG, "Answering call");
TelephonyManager telephony = (TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
try {
Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony) m.invoke(telephony);
//telephonyService.silenceRinger();
telephonyService.answerRingingCall();
} catch (Exception e) {
e.printStackTrace();
}
}
public void answerCall(){
try {
// logger.debug("execute input keycode headset hook");
Runtime.getRuntime().exec("input keyevent " +
Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK));
} catch (IOException e) {
Log.e("Call Exception ",e.toString());
HelperMethods.showToastS(getBaseContext(),"Call Exception one "+e.toString());
// Runtime.exec(String) had an I/O problem, try to fall back
// logger.debug("send keycode headset hook intents");
String enforcedPerm = "android.permission.CALL_PRIVILEGED";
Intent btnDown = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(
Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN,
KeyEvent.KEYCODE_HEADSETHOOK));
Intent btnUp = new Intent(Intent.ACTION_MEDIA_BUTTON).putExtra(
Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP,
KeyEvent.KEYCODE_HEADSETHOOK));
sendOrderedBroadcast(btnDown, enforcedPerm);
sendOrderedBroadcast(btnUp, enforcedPerm);
}
}
這在 android 版本 9 中對我有用
此代碼在您的答案中單擊...
if (VERSION.SDK_INT >= 26) {
IncomingActivity incomingActivity = IncomingActivity.this;
new Thread(new C1736O(incomingActivity)).start();
} else if (VERSION.SDK_INT >= 21) {
IncomingActivity incomingActivity2 = IncomingActivity.this;
new Thread(new C1735LN(incomingActivity2)).start();
} else {
Intent intent = new Intent("android.intent.action.MEDIA_BUTTON");
intent.putExtra("android.intent.extra.KEY_EVENT", new KeyEvent(0, 79));
IncomingActivity.this.sendOrderedBroadcast(intent, "android.permission.CALL_PRIVILEGED");
Intent intent2 = new Intent("android.intent.action.MEDIA_BUTTON");
intent2.putExtra("android.intent.extra.KEY_EVENT", new KeyEvent(1, 79));
IncomingActivity.this.sendOrderedBroadcast(intent2, "android.permission.CALL_PRIVILEGED");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.