2013-02-05 37 views
5

Tôi cần phát hiện xem tai nghe có dây cắm vào có micrô hay không.Phát hiện xem tai nghe có micrô

Tôi có thể kiểm tra xem tai nghe đã được cắm vào chưa bằng cách sử dụng isWiredHeadSetOn(), nhưng đối với micrô dường như không phải là phương pháp như vậy trong lớp AudioManager.

Tôi đã tìm thấy một số đề xuất sử dụng ACTION_HEADSET_PLUG nhưng tôi muốn tìm hiểu thông tin này ngay cả khi tai nghe đã được cắm trước khi mở ứng dụng của tôi, sự kiện này sẽ không được kích hoạt trong suốt thời gian sử dụng ứng dụng của tôi.

Bất kỳ ý tưởng nào về vấn đề này? Cảm ơn bạn trước.

+0

tại sao bạn cần nó? đó là tùy thuộc vào người dùng để biết vị trí của micrô là – njzk2

+0

Vì tôi muốn kết nối flash thông qua giắc cắm âm thanh và điều này giúp tôi phân biệt giữa 2 loại flash. – niculare

+1

đèn flash trong ổ cắm âm thanh? chúng ta có thể làm điều đó ? – njzk2

Trả lời

12

CẬP NHẬT: Hãy tiếp tục và đăng ký ACTION_HEADSET_PLUG trong hoạt động của bạn onResume(). Nếu người dùng đã từng cắm tai nghe sau khi khởi động, nền tảng sẽ cung cấp trạng thái mới nhất cho hoạt động của bạn khi nó tiếp tục.

Tiếp theo mã kiểm tra làm việc:

package com.example.headsetplugtest; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.util.Log; 

public class HeadSetPlugIntentActivity extends Activity { 

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      final String action = intent.getAction(); 
      if (Intent.ACTION_HEADSET_PLUG.equals(action)) { 
       Log.d("HeadSetPlugInTest", "state: " + intent.getIntExtra("state", -1)); 
       Log.d("HeadSetPlugInTest", "microphone: " + intent.getIntExtra("microphone", -1)); 
      } 
     } 
    }; 

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

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

     IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); 
     getApplicationContext().registerReceiver(mReceiver, filter); 
    } 

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

     getApplicationContext().unregisterReceiver(mReceiver); 
    } 
} 
+0

Cảm ơn bạn! Tôi không biết rằng onReceive() cũng được gọi khi hoạt động được bắt đầu – niculare

+1

Không phải là các chương trình phát sóng kết nối thiết bị của loại 'FLAG_RECEIVER_REGISTERED_ONLY'? I E. "khi gửi một máy thu phát đã đăng ký sẽ được gọi - không có thành phần BroadcastReceiver nào sẽ được khởi chạy" - hoặc được mô tả rõ ràng hơn bởi Dianne Hackborn: "Nó chỉ dành cho những người gọi registerReceiver và không được gửi tới người nhận đã khai báo trong tệp kê khai." – Michael

+0

@Michael, bạn đã đúng. Đã cập nhật câu trả lời của tôi ở trên. – ozbek

Các vấn đề liên quan