Devo rilevare se un dispositivo HDMI è collegato o meno al mio dispositivo Android. Per questo sto usando un BroadcastReceiver ed è in grado di rilevare anche. Ma con BroadcastReceiver non riesco a gestire lo scenario quando il dispositivo HDMI è collegato ancora prima che la mia applicazione venisse caricata. In questo caso BroadcastReceiver non è in grado di rilevare se un dispositivo HDMI è collegato o meno. C'è un modo per sapere se un dispositivo HDMI è collegato o no in qualsiasi momento?Come verificare lo stato della connessione del dispositivo HDMI in Android?
risposta
sono arrivato fino a questo utilizzando le altre risposte e un po 'da altrove:
/**
* 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;
}
}
Se stai controllando spesso, che ci si vuole memorizzare il risultato e aggiornarlo con ascoltatore @ di hamen .
Lo stesso problema qui. Alcuni google-ing mi ha detto che non c'è molta speranza con altri produttori oltre a Motorola, però da http://developer.sonymobile.com/wp/2012/05/29/how-to-use-the-hidden-hdmi-api-tutorial/:
Un'applicazione in grado di rilevare se il dispositivo è collegare tramite un connettore HDMI ascoltando l'intento di trasmissione: "com .sonyericsson.intent.action.HDMI_EVENT"
controllo il file/sys/class/switch/HDMI/stato, se è 1, allora è collegato a un HDMI
suppone che il dispositivo debba essere rootato? – Adi
no, il dispositivo non ha bisogno di essere rootato –
mi è uscito con questo alla fine. Funziona su S3 e S4. Dovrebbe funzionare con qualsiasi versione Android 4+.
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 ha bisogno di questo in tag applicazione:
<receiver android:name="__com.example.android__.HdmiListener" >
<intent-filter>
<action android:name="android.intent.action.HDMI_PLUGGED" />
</intent-filter>
</receiver>
Questo mi ha aiutato a scoprire se l'hdmi è connesso o disconnesso, ma non sapendo se l'hdmi è collegato prima di eseguire l'app. – jch
è possibile ottenere i dati dal /sys/class/display/display0.hdmi/connect
. Se il contenuto del file è 0
, HDMI non è collegato, altrimenti se è 1
, HDMI è connesso.
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();
}
suppone che il dispositivo debba essere rootato? – Adi
penso che non sia necessario il rooting del dispositivo. –
Condividi il tuo codice di ricezione broadcast. È destinato a funzionare solo per i dispositivi Motorola ... ?? La risposta –
[questa] (https://stackoverflow.com/a/21383495/1921481) ha funzionato per me, ha dovuto solo sostituire l'intento. Invece di "android.intent.action.HDMI_PLUGGED" deve essere "android.intent.action.HDMI_HW_PLUGGED". (Questo avrebbe dovuto essere più di un commento a quella risposta, ma la mia reputazione non mi consente di commentare). –