2015-07-03 57 views
2

基本上,我希望我的應用在耳機單擊兩次後在背景中執行某些操作。 只有當我想從調試器獲取信息時,此代碼纔有效,我要做的是從主要活動調用方法或單擊主要活動中的按鈕。訪問來自廣播接收機的主要活動方法/組件

舉例: 一旦我從耳機上雙擊,點擊主要活動中的按鈕。

有關如何做到這一點的任何建議?

P.D.
這是我在android上的第一個應用程序,所以我想要一些關於它的反饋。
我的手機是Android 4.4.2,以防有人告訴我爲什麼我沒有使用MediaSession或其他任何東西。 (我知道registerMediaButtonEventReceiver已廢棄)


接收器類:

public class MediaReceiver extends BroadcastReceiver { 

    private static int d = 0; 

    public MediaReceiver() { 
    } 

    @Override 
    public void onReceive(final Context context, Intent intent) { 
     String intentAction = intent.getAction(); 
     if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) 
      return; 
     KeyEvent event = (KeyEvent) intent 
       .getParcelableExtra(Intent.EXTRA_KEY_EVENT); 
     int keycode = event.getKeyCode(); 
     int action = event.getAction(); 

     switch (keycode) { 
      case KeyEvent.KEYCODE_HEADSETHOOK: 
       if (action == KeyEvent.ACTION_DOWN) { 
        d++; 

        Handler handler = new Handler(); 
        Runnable r = new Runnable() { 
         @Override 
         public void run() { 
          if (d == 1) { 
           Log.i("Info", "single click!"); 
          } 
          // double click 
          if (d == 2) { 
           Log.i("Info", "double click!"); 

           //handleClick(); this method is inside MainActivity 
          } 
          d = 0; 
         } 
        }; 
        if (d == 1) { 
         handler.postDelayed(r, 400); 
        } 
       } 
       break; 
     } 
     abortBroadcast(); 
    } 
} 


的onCreate MainActivity類別:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     txtText = (TextView) findViewById(R.id.status); 
     btnStart = (ImageButton) findViewById(R.id.startButton); 
     focus = (Chronometer) findViewById(R.id.chronometer); 

     btnStart.setBackgroundResource(R.drawable.start_button); 
     focus.setFormat("%s"); 

     manager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     wl = manager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "Proximity screen"); 

     mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     mReceiverComponent = new ComponentName(this, MediaReceiver.class); 

     FillTaskScrollList(); 

     btnStart.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (headsetState == DISABLED_HEADSET_BUTTON) { 
        headsetState = ENABLED_HEADSET_BUTTON; 
        wl.acquire(); 
        ... 
        focus.stop(); 
        focus.setBase(SystemClock.elapsedRealtime()); 
        btnStart.setBackgroundResource(R.drawable.stop_button); 
        mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent); 
       } else { 
        headsetState = DISABLED_HEADSET_BUTTON; 
        wl.release(); 
        ... 
        focus.stop(); 
        btnStart.setBackgroundResource(R.drawable.start_button); 
       } 
      } 
     }); 
    } 

回答

2

我已經設法解決這個問題。

你必須使用另一個廣播接收器(你需要在類中)在另一類趕上從的BroadcastReceiver的消息。在我的情況下是MediaReceiver所以我不得不添加這些行來發送消息給我想要使用的活動。


MediaReceive的onReceive()
您需要創建一個新的意圖,我命名爲「android.intent.MAIN」,你必須將這個消息添加到意圖(你可以做到這一點使用putExtra [S ] 方法)。

public void onReceive(final Context context, Intent intent) { 
    ... 
    Intent in = new Intent("android.intent.MAIN") 
    in.putExtra("get_msg", "voice_rec"); 

    context.sendBroadcast(in); 
    ... 
} 


MainActivity

我宣佈一個新的廣播接收器和添加的onResume /的onPause方法。 使用我在MediaReceive類中創建的Intent中使用的相同名稱創建了一個IntentFilter。這樣做可以讓您通過BroadcastReceiver類和活動發送消息。剩下的代碼就是你想要處理的消息,調用一個方法或者更新一個變量。

private BroadcastReceiver mIntentReceiver; 

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

    IntentFilter intentFilter = new IntentFilter("android.intent.MAIN"); 
    mIntentReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String msg = intent.getStringExtra("get_msg"); 

      } 
     } 
    }; 
    this.registerReceiver(mIntentReceiver, intentFilter); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    this.unregisterReceiver(this.mIntentReceiver); 
} 

不要忘記每個BroadcastReceiver的註冊/取消註冊。

我希望這對任何遇到問題的人都有幫助。 隨時留下評論。

來源:https://sites.google.com/site/zainozzaini/android/receive-sms-using-android-broadcastreceiver-inside-an-activity