2010-05-20 20 views
22

¿Hay alguna manera de verificar y ver si existe una actividad en su 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.¿Determina si existe una actividad en el dispositivo actual?

¿Hay alguna manera de verificar y ver si existe la actividad? No creo que pueda detectar la excepción de tiempo de ejecución ya que startActivity() no lo arroja.

Respuesta

6

no creo que pueda coger el tiempo de ejecución excepción

En realidad, esto funciona:

try { 
    startActivity(new Intent(..)); 
} catch (ActivityNotFoundException e) { 
    Toast.makeText(this, "Not installed.", LENGTH_SHORT).show(); 
} 
+6

Esto funciona, por supuesto, pero generalmente se considera una mala práctica hacerlo de esta manera. La respuesta correcta de Samuh (http://stackoverflow.com/a/2879403/15695) es la forma correcta de hacerlo. – BoD

+0

No solo es una mala práctica, pero si necesita utilizar startActivityForResult, hay algunos problemas serios de congelación/eficiencia en los dispositivos en los que he probado. –

69

Puede crear un objeto Intento con la información necesaria del componente 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; 
} 
+1

Esta es la correcta * * Respuesta :) – hrules6872

+0

¿Cómo se usa esto? –

7

que 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)); 
     } 

Th se asegura de 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.

14

Esta es la forma más sencilla de hacer esto:

boolean activityExists = intent.resolveActivityInfo(getPackageManager(), 0) != null; 

También es el recommended by Google:

verificar en primer lugar que existe una aplicación para recibir la intención, llame resolveActivity() en su Intención objeto. Si el resultado no es nulo, existe al menos una aplicación que puede manejar el intento y es seguro llamar al startActivity(). Si el resultado es nulo, no debe usar el intento y, si es posible, debe desactivar la función que invoca el intento.

+1

Devuelve verdadero para la actividad que no existe. Me temo que esta no es la mejor solución. He usado el método isCallable publicado en otra respuesta y funciona como se esperaba. – tomrozb

+0

@toro ¿Qué devuelve 'intent.resolveActivity (getPackageManager())'? Si este método realmente devuelve una actividad no existente, definitivamente se parece a un error. Además, de acuerdo con la documentación de Google, 'List list = getPackageManager(). QueryIntentActivities (intento, PackageManager.MATCH_DEFAULT_ONLY);' hace exactamente lo mismo, excepto que no devuelve la actividad con la máxima prioridad. – Malcolm

+1

Tengo la intención creada de esta manera: 'intent.setComponent (new ComponentName (" package "," package.activity-name)); '¿Qué devuelve usted pregunta -' ComponentInfo {"package"/"package.activity- nombre} '. Pero, de hecho, la actividad no existe, por lo que llamar a este intento terminará en un crash en tiempo de ejecución. – tomrozb

0

Así es como puedo comprobar si un Activity está 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); 
     } 
Cuestiones relacionadas