2011-12-27 33 views
11

Tôi cần phát hiện xem thiết bị HDMI có được kết nối hay không với thiết bị Android của tôi. Đối với điều này tôi đang sử dụng một BroadcastReceiver và nó có thể phát hiện cũng. Nhưng với BroadcastReceiver, tôi không thể xử lý tình huống khi thiết bị HDMI được kết nối ngay cả trước khi ứng dụng của tôi bị tắt. Trong trường hợp này, BroadcastReceiver không thể tìm thấy nếu bất kỳ thiết bị HDMI nào được kết nối hay không. Có cách nào tôi có thể biết liệu thiết bị HDMI nào được kết nối hay không tại bất kỳ điểm nào?Cách kiểm tra trạng thái kết nối thiết bị HDMI trong Android?

+0

Chia sẻ mã nhận phát sóng của bạn. Được thiết kế chỉ hoạt động cho các thiết bị Motorola ... ?? –

+0

[Này] (https://stackoverflow.com/a/21383495/1921481) câu trả lời đã làm việc cho tôi, chỉ cần thay thế ý định. Thay vì "android.intent.action.HDMI_PLUGGED", nó phải là "android.intent.action.HDMI_HW_PLUGGED". (Điều này được cho là có nhiều nhận xét hơn cho câu trả lời đó nhưng danh tiếng của tôi không cho phép tôi bình luận). –

Trả lời

6

tôi đến với điều này bằng cách sử dụng câu trả lời khác và một số từ nơi khác:

/** 
* Checks device switch files to see if an HDMI device/MHL device is plugged in, returning true if so. 
*/ 
private boolean isHdmiSwitchSet() { 

    // The file '/sys/devices/virtual/switch/hdmi/state' holds an int -- if it's 1 then an HDMI device is connected. 
    // An alternative file to check is '/sys/class/switch/hdmi/state' which exists instead on certain devices. 
    File switchFile = new File("/sys/devices/virtual/switch/hdmi/state"); 
    if (!switchFile.exists()) { 
     switchFile = new File("/sys/class/switch/hdmi/state"); 
    } 
    try { 
     Scanner switchFileScanner = new Scanner(switchFile); 
     int switchValue = switchFileScanner.nextInt(); 
     switchFileScanner.close(); 
     return switchValue > 0; 
    } catch (Exception e) { 
     return false; 
    } 
} 

Nếu bạn đang kiểm tra thường xuyên, bạn muốn để lưu trữ kết quả và cập nhật nó với người nghe @ hamen của .

0

Cùng một vấn đề ở đây. Một số google-ing nói với tôi không có nhiều hy vọng với các nhà sản xuất khác ngoài Motorola, tuy nhiên từ http://developer.sonymobile.com/wp/2012/05/29/how-to-use-the-hidden-hdmi-api-tutorial/:

Một ứng dụng có thể phát hiện nếu điện thoại được kết nối thông qua một nối HDMI bằng cách lắng nghe đến mục đích phát sóng: "com .sonyericsson.intent.action.HDMI_EVENT"

0

kiểm tra các tập tin/sys/lớp/switch/HDMI/tiểu bang, nếu đó là 1 thì nó kết nối với HDMI

+0

thực hiện điều này có giả thiết rằng thiết bị phải được root? – Adi

+0

không, thiết bị không cần phải được bắt nguồn từ –

4

tôi ra với điều này cuối cùng. Nó hoạt động trên S3 và S4. Nó sẽ hoạt động với bất kỳ phiên bản Android 4+ nào.

public class HdmiListener extends BroadcastReceiver { 

    private static String HDMIINTENT = "android.intent.action.HDMI_PLUGGED"; 

    @Override 
    public void onReceive(Context ctxt, Intent receivedIt) { 
     String action = receivedIt.getAction(); 

     if (action.equals(HDMIINTENT)) { 
      boolean state = receivedIt.getBooleanExtra("state", false); 

      if (state) { 
       Log.d("HDMIListner", "BroadcastReceiver.onReceive() : Connected HDMI-TV"); 
       Toast.makeText(ctxt, "HDMI >>", Toast.LENGTH_LONG).show();  
      } else { 
       Log.d("HDMIListner", "HDMI >>: Disconnected HDMI-TV"); 
       Toast.makeText(ctxt, "HDMI DisConnected>>", Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 
} 

AndroidManifest.xml cần này vào thẻ ứng dụng:

<receiver android:name="__com.example.android__.HdmiListener" > 
     <intent-filter> 
      <action android:name="android.intent.action.HDMI_PLUGGED" /> 
     </intent-filter> 
    </receiver> 
+2

Điều này đã giúp tôi phát hiện xem hdmi được kết nối hay ngắt kết nối, nhưng không biết là hdmi được kết nối trước khi chạy ứng dụng. – jch

4

Bạn có thể lấy dữ liệu từ /sys/class/display/display0.hdmi/connect. Nếu nội dung của tập tin là 0, HDMI không được kết nối, nếu không nếu là 1, thì HDMI sẽ được kết nối.

try { 
    File file = new File("/sys/class/display/display0.hdmi/connect"); 
    InputStream in = new FileInputStream(file); 
    byte[] re = new byte[32768]; 
    int read = 0; 
    while ((read = in.read(re, 0, 32768)) != -1) { 
     String string = new String(re, 0, read); 
     Log.v("String_whilecondition", "HDMI state = " + string); 
     result = string; 
    } 
    in.close(); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 
+0

thực hiện điều này có giả thiết rằng thiết bị phải được root? – Adi

+0

tôi nghĩ rằng không cần phải root thiết bị. –

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