android - programacion - conectar celular a tv por bluetooth
¿Determinando si existe una actividad en el dispositivo actual? (5)
¿Hay alguna manera de verificar y ver si existe una actividad en tu dispositivo? Si tengo un enlace de video de YouTube, quiero especificar que se abra en YouTube PlayerActivity. Sin embargo, no quiero colapsar si por alguna razón no lo tienen.
¿Hay alguna manera de verificar y ver si la actividad existe? No creo que pueda detectar la excepción de tiempo de ejecución ya que startActivity () no lo arroja.
No creo que pueda atrapar la excepción de tiempo de ejecución
En realidad, esto funciona:
try {
startActivity(new Intent(..));
} catch (ActivityNotFoundException e) {
Toast.makeText(this, "Not installed.", LENGTH_SHORT).show();
}
Así es como compruebo si hay una Activity
disponible en el dispositivo:
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tell//:" + phoneNumber));
PackageManager manager = context.getPackageManager();
List<ResolveInfo> activities = manager.queryIntentActivities(
intent, 0);
if (!manager.hasSystemFeature(
PackageManager.FEATURE_TELEPHONY) || activities == null || activities
.size() < 1) {
Toast.makeText(
context,
"Sorry, there were no apps that worked with that request.",
Toast.LENGTH_SHORT).show();
} else {
context.startActivity(intent);
}
Esta es la forma más simple de hacer esto:
boolean activityExists = intent.resolveActivityInfo(getPackageManager(), 0) != null;
También es el recomendado por Google :
Para verificar primero que existe una aplicación para recibir el intento, llame a
resolveActivity()
en su objeto Intent. Si el resultado no es nulo, hay al menos una aplicación que puede manejar el intento y es seguro llamar astartActivity()
. Si el resultado es nulo, no debe usar el intento y, si es posible, debe desactivar la función que invoca el intento.
Puede crear un objeto Intent con la información del componente necesaria y luego verificar si el intento es invocable o no. Me encontré con este fragmento aquí en SO, no tengo el enlace al hilo real.
private boolean isCallable(Intent intent) {
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
Terminé haciendo:
Intent intent = new Intent();
intent.setClassName( "com.google.android.gsf", "com.google.android.gsf.login.AccountIntroActivity" );
if(getContext().getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
getContext().startActivity( intent );
} else {
getContext().startActivity(new Intent(Settings.ACTION_ADD_ACCOUNT));
}
Esto garantiza que exista la intención de agregar cuenta específica de Google, y si no, vuelve a los ACTION_ADD_ACCOUNTS generales más generales.