2016-09-27 5 views
20

मैं एंड्रॉइड 5.0 में अपने फोन के फोन के जीयूआई (फोन के जीयूआई) का जवाब देकर एक इनकमिंग कॉल स्वीकार करना चाहता हूं। मुझे एक ऐसा तरीका मिला जिसने एक ऐसी गतिविधि की आवश्यकता है जो फोन के जीयूआई को खोलने के लिए कुछ कार्रवाई भेजने के लिए उपयोग करे। मैं आने वाली कॉल के लिए फोन की जीयूआई चालू करने में सफल रहा। मुद्दा यह है कि मैं फोन के जीयूआई के लिए स्पीकर कैसे चालू कर सकता हूं। मैंने कोड की कोशिश की लेकिन यह चालू नहीं है। तुम मुझे एंड्रॉयड एलAndroid L में प्रोग्रामेटिक रूप से इनकमिंग कॉल के लिए स्पीकर कैसे चालू करें?

audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
audioManager.setMode(AudioManager.MODE_IN_CALL); 
if (!audioManager.isSpeakerphoneOn()) 
    audioManager.setSpeakerphoneOn(true); 
audioManager.setMode(AudioManager.MODE_NORMAL); 

प्रकट

<uses-permission android:name="android.permission.CALL_PHONE"/> 
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> 
<uses-permission android:name="android.permission.RECORD_AUDIO"/> 
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> 

इसके अलावा में है कि इस मुद्दे को हल करने में मदद कर सकते हैं, हम एक आने वाली कॉल का जवाब देने के फोन की मंशा का उपयोग कर स्वीकार खोलने के लिए अधिक shoter तरीका है। मेरा रास्ता इतना लंबा है क्योंकि यह एक गतिविधि का उपयोग करता है।

यह मेरा पूर्ण वर्ग कोड

public class AcceptCallActivity extends Activity { 

    private static final String MANUFACTURER_HTC = "HTC"; 
    private KeyguardManager keyguardManager; 
    private AudioManager audioManager; 
    private CallStateReceiver callStateReceiver; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
     audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);   
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     registerCallStateReceiver(); 
     updateWindowFlags(); 
     acceptCall(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     if (callStateReceiver != null) { 
      unregisterReceiver(callStateReceiver); 
      callStateReceiver = null; 
     } 
    } 

    private void registerCallStateReceiver() { 
     callStateReceiver = new CallStateReceiver(); 
     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); 
     registerReceiver(callStateReceiver, intentFilter); 
    } 

    private void updateWindowFlags() { 
     if (keyguardManager.inKeyguardRestrictedInputMode()) { 
      getWindow().addFlags(
        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
          WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | 
          WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
     } else { 
      getWindow().clearFlags(
        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
          WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | 
          WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
     } 
    } 

    private void acceptCall() { 

     // for HTC devices we need to broadcast a connected headset 
     boolean broadcastConnected = MANUFACTURER_HTC.equalsIgnoreCase(Build.MANUFACTURER) 
       && !audioManager.isWiredHeadsetOn(); 

     if (broadcastConnected) { 
      broadcastHeadsetConnected(false); 
     } 

     try { 
      try { 
       Log.d("AnswerCall","execute input keycode headset hook"); 
       //Turn on speaker 
       audioManager.setMode(AudioManager.MODE_IN_CALL); 
       if (!audioManager.isSpeakerphoneOn()) 
        audioManager.setSpeakerphoneOn(true); 
       audioManager.setMode(AudioManager.MODE_NORMAL); 
       Runtime.getRuntime().exec("input keyevent " + 
         Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK)); 

      } catch (IOException e) { 
       // Runtime.exec(String) had an I/O problem, try to fall back 
       Log.d("AnswerCall","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); 
      } 
     } finally { 
      if (broadcastConnected) { 
       broadcastHeadsetConnected(false); 
      } 
     } 
    } 

    private void broadcastHeadsetConnected(boolean connected) { 
     Intent i = new Intent(Intent.ACTION_HEADSET_PLUG); 
     i.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 
     i.putExtra("state", connected ? 1 : 0); 
     i.putExtra("name", "mysms"); 
     try { 
      sendOrderedBroadcast(i, null); 
     } catch (Exception e) { 
     } 
    } 


    private class CallStateReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      finish(); 
     } 
    } 
} 
+0

http://stackoverflow.com/q/16188831/2900127 – 7geeky

+0

मैंने पहले उस लिंक को आजमाया लेकिन यह मेरे फोन – Jame

+0

के लिए काम नहीं करता है यदि आप एपीआई स्तर> = 23 का उपयोग कर रहे हैं तो रनटाइम अनुमति भी जांचें और यदि संभव हो तो चेक करें लॉगकैट आपको किसी भी तरह की त्रुटि या चेतावनी मिल सकती है, फिर इसे यहां रखें – Vickyexpert

उत्तर

11

अंत में है, मैं समाधान मिल गया। मैंने थ्रेड के अंदर कोड चलाया। यह अच्छी तरह से काम किया। यह मेरा कोड है। उम्मीद है कि यह किसी की मदद कर सकता है

  Thread thread = new Thread() { 
       @Override 
       public void run() { 
        try { 
         while(true) { 
          sleep(1000); 
          audioManager.setMode(AudioManager.MODE_IN_CALL); 
          if (!audioManager.isSpeakerphoneOn()) 
           audioManager.setSpeakerphoneOn(true); 
         } 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      }; 

      thread.start(); 
-1

मैं इस समाधान में आया था। उम्मीद है कि यह आपकी मदद करता है।

अंतिम स्थैतिक int FOR_MEDIA = 1;

अंतिम स्थैतिक int FORCE_NONE = 0;

अंतिम स्थैतिक int FORCE_SPEAKER = 1;

कक्षा ऑडियोसिस्टम क्लास = कक्षा .forName ("android.media.AudioSystem");

विधि setForceUse = audioSystemClass.getMethod ("setForceUse", int.class, int.class);

setForceUse.invoke (शून्य, FOR_MEDIA, FORCE_SPEAKER);

संबंधित मुद्दे