2016-09-27 70 views
20

我想在Android 5.0中使用手機的應答手機GUI(手機的GUI)接聽來電。我找到了一種方法,需要做一個活動來發送一些動作來打開手機的GUI。我成功地打開了電話的圖形用戶界面以接聽來電。問題是我如何打開手機GUI的揚聲器。我嘗試了代碼,但它不打開。你能幫我解決Android L移動如何在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

如果您使用的是API級別> = 23,請檢查運行時權限,如果可能,請檢查logcat你可能會收到任何類型的錯誤或警告,然後把它放在這裏 – 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

我遇到了這個解決方案。希望它能幫助你。

final static int FOR_MEDIA = 1;

final static int FORCE_NONE = 0;

final static int FORCE_SPEAKER = 1;

Class audioSystemClass = Class.forName(「android.media.AudioSystem」);

方法setForceUse = audioSystemClass.getMethod(「setForceUse」,int.class,int.class);

setForceUse.invoke(null,FOR_MEDIA,FORCE_SPEAKER);

相關問題