2016-04-12 5 views
1

Можно ли запрограммировать вызов в 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()); 
     } 
    } 

} 

Функция отклонять вызов работает нормально, но принять вызов не работает.

Пожалуйста, помогите мне за то же самое.

ответ

1

Я столкнулся с тем же вопросом для своего приложения. Положите задержку для приема входящего вызова (~ 3000 мс). Вам также нужно вызвать метод acceptCall() в другой теме.

См How can incoming calls be answered programmatically in 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(); 
     } 

    } 
+0

Привет Daaud .. Спасибо за ответ .. Я использовал ваш код и протестировал его gving me: Caused by: java.lang.SecurityException: ни пользователь 10228, ни текущий процесс имеет android.permission.MODIFY_PHONE_STATE. Не могли бы вы помочь мне с этим ... –

+0

Извините, MODIFY_PHONE_STATE - это системное разрешение, поэтому вы не можете получить доступ или использовать это разрешение в своем приложении. –

+0

Есть ли другой способ сделать это, поскольку некоторые приложения в игровом магазине выполняют одну и ту же работу? –

0

Это работает для меня.

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

Спасибо. Но после копирования ошибки кода появляется «Не удалось разрешить символ ITelephony» –

+0

Убедитесь, что имя пакета остается таким же. 'пакет com.android.internal.telephony; общественный интерфейс ITelephony { boolean endCall(); void answerRingingCall(); void silenceRinger(); } ' – am110787

+0

Привет, Спасибо, после создания такого же имени пакета, компилируется ошибка, но по вызову, java.lang.SecurityException: ни пользователь 10228, ни текущий процесс не имеет android.permission.MODIFY_PHONE_STATE исключение приходит на функцию telephonyService.answerRingingCall() ;. Не могли бы вы помочь мне в этом. –

0
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); 
        } 
} 
+0

Это работает для Зефира и Нуги? –