android - putextra - intent-filter
Abra otra aplicaciĆ³n suya(intento) (20)
Sé cómo actualizar mis propios programas, y sé cómo abrir programas usando un Uri predefinido (para sms o correo electrónico, por ejemplo)
Necesito saber cómo puedo crear una intención para abrir MyTracks o cualquier otra aplicación que no sé qué intenciones escuchan.
Recibí esta información de DDMS, pero no he tenido éxito en convertir esto en un Intento que puedo usar. Esto se toma al abrir MyTracks manualmente.
Gracias por tu ayuda
05-06 11:22:24.945: INFO/ActivityManager(76): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks bnds=[243,338][317,417] }
05-06 11:22:25.005: INFO/ActivityManager(76): Start proc com.google.android.maps.mytracks for activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: pid=1176 uid=10063 gids={3003, 1015}
05-06 11:22:26.995: INFO/ActivityManager(76): Displayed activity com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks: 1996 ms (total 1996 ms)
Lanzar una aplicación desde otra aplicación en Android
Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
startActivity(launchIntent);
// Esto funciona en Android Lollipop 5.0.2
public static boolean launchApp(Context context, String packageName) {
final PackageManager manager = context.getPackageManager();
final Intent appLauncherIntent = new Intent(Intent.ACTION_MAIN);
appLauncherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = manager.queryIntentActivities(appLauncherIntent, 0);
if ((null != resolveInfos) && (!resolveInfos.isEmpty())) {
for (ResolveInfo rInfo : resolveInfos) {
String className = rInfo.activityInfo.name.trim();
String targetPackageName = rInfo.activityInfo.packageName.trim();
Log.d("AppsLauncher", "Class Name = " + className + " Target Package Name = " + targetPackageName + " Package Name = " + packageName);
if (packageName.trim().equals(targetPackageName)) {
Intent intent = new Intent();
intent.setClassName(targetPackageName, className);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
Log.d("AppsLauncher", "Launching Package ''" + packageName + "'' with Activity ''" + className + "''");
return true;
}
}
}
return false;
}
Abra la aplicación si existe, o abra la aplicación Play Store para instalarla:
private void open() {
openApplication(getActivity(), "com.app.package.here");
}
public void openApplication(Context context, String packageN) {
Intent i = context.getPackageManager().getLaunchIntentForPackage(packageN);
if (i == null) {
i.addCategory(Intent.CATEGORY_LAUNCHER);
context.startActivity(i);
} else {
try {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
}
catch (android.content.ActivityNotFoundException anfe) {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
}
}
}
Al usar la solución de inversus, amplié el fragmento con una función que se ejecutará cuando la aplicación deseada no esté instalada en este momento. Entonces funciona así: ejecuta la aplicación por nombre del paquete. Si no se encuentra, abra Android market - Google play para este paquete .
public void startApplication(String packageName)
{
try
{
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
List<ResolveInfo> resolveInfoList = getPackageManager().queryIntentActivities(intent, 0);
for(ResolveInfo info : resolveInfoList)
if(info.activityInfo.packageName.equalsIgnoreCase(packageName))
{
launchComponent(info.activityInfo.packageName, info.activityInfo.name);
return;
}
// No match, so application is not installed
showInMarket(packageName);
}
catch (Exception e)
{
showInMarket(packageName);
}
}
private void launchComponent(String packageName, String name)
{
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.setComponent(new ComponentName(packageName, name));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
private void showInMarket(String packageName)
{
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
Y se usa así:
startApplication("org.teepee.bazant");
Alternativamente, también puede abrir el intento desde su aplicación en la otra aplicación con:
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
donde uri
es el enlace profundo a la otra aplicación
Como las aplicaciones no pueden cambiar muchas de las configuraciones del teléfono, puede abrir una actividad de configuración como otra aplicación.
Mire su salida de LogCat después de que realmente modificó la configuración manualmente:
INFO/ActivityManager(1306): Starting activity: Intent { act=android.intent.action.MAIN cmp=com.android.settings/.DevelopmentSettings } from pid 1924
Luego, use esto para mostrar la página de configuración desde su aplicación:
String SettingsPage = "com.android.settings/.DevelopmentSettings";
try
{
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(ComponentName.unflattenFromString(SettingsPage));
intent.addCategory(Intent.CATEGORY_LAUNCHER );
startActivity(intent);
}
catch (ActivityNotFoundException e)
{
log it
}
En primer lugar, el concepto de "aplicación" en Android es ligeramente extenso.
Una aplicación, técnicamente un proceso, puede tener múltiples actividades, servicios, proveedores de contenido y / o radio escuchas. Si al menos uno de ellos se está ejecutando, la aplicación está en funcionamiento (el proceso).
Entonces, lo que tiene que identificar es cómo quiere "iniciar la aplicación".
Ok ... esto es lo que puedes probar:
- Crea un intento con
action=MAIN
ycategory=LAUNCHER
- Obtenga el
PackageManager
del contexto actual usandocontext.getPackageManager
-
packageManager.queryIntentActivity(<intent>, 0)
donde intento tienecategory=LAUNCHER
,action=MAIN
opackageManager.resolveActivity(<intent>, 0)
para obtener la primera actividad con main / launcher - Obtenga la
ActivityInfo
que está interesado - Desde
ActivityInfo
, obtenga elname
delpackageName
y elname
- Finalmente, cree otro intento con
category=LAUNCHER
,action=MAIN
,componentName = new ComponentName(packageName, name)
ysetFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- Finalmente,
context.startActivity(newIntent)
Este es el código de mi solución basada en la solución MasterGaurav:
private void launchComponent(String packageName, String name){
Intent launch_intent = new Intent("android.intent.action.MAIN");
launch_intent.addCategory("android.intent.category.LAUNCHER");
launch_intent.setComponent(new ComponentName(packageName, name));
launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(launch_intent);
}
public void startApplication(String application_name){
try{
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
List<ResolveInfo> resolveinfo_list = activity.getPackageManager().queryIntentActivities(intent, 0);
for(ResolveInfo info:resolveinfo_list){
if(info.activityInfo.packageName.equalsIgnoreCase(application_name)){
launchComponent(info.activityInfo.packageName, info.activityInfo.name);
break;
}
}
}
catch (ActivityNotFoundException e) {
Toast.makeText(activity.getApplicationContext(), "There was a problem loading the application: "+application_name,Toast.LENGTH_SHORT).show();
}
}
Lo he trabajado así,
/** Open another app.
* @param context current Context, like Activity, App, or Service
* @param packageName the full package name of the app to open
* @return true if likely successful, false if unsuccessful
*/
public static boolean openApp(Context context, String packageName) {
PackageManager manager = context.getPackageManager();
try {
Intent i = manager.getLaunchIntentForPackage(packageName);
if (i == null) {
return false;
//throw new ActivityNotFoundException();
}
i.addCategory(Intent.CATEGORY_LAUNCHER);
context.startActivity(i);
return true;
} catch (ActivityNotFoundException e) {
return false;
}
}
Ejemplo de uso:
openApp(this, "com.google.android.maps.mytracks");
Espero que ayude a alguien.
Para API nivel 3+, nada más que una línea de código:
Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");
Devuelve un intento de lanzamiento de CATEGORY_INFO (aplicaciones sin actividad de iniciador, fondos de pantalla, por ejemplo, a menudo lo utilizan para proporcionar información sobre la aplicación) y, si no lo encuentra, devuelve CATEGORY_LAUNCH del paquete, si existe.
Para iniciar otra actividad de aplicación desde mi aplicación Actividad. Está funcionando bien para mí.
El siguiente código funcionará si la otra aplicación ya está instalada en su teléfono, de lo contrario no es posible redireccionar de una aplicación a otra. Por lo tanto, asegúrese de que su aplicación se haya iniciado o no.
Intent intent = new Intent();
intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity");
startActivity(intent);
Prueba este código, espero que esto te ayude. Si este paquete está disponible, esto abrirá la aplicación o abrirá la tienda de juegos para descargar
String packageN = "aman4india.com.pincodedirectory";
Intent i = getPackageManager().getLaunchIntentForPackage(packageN);
if (i != null) {
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);
} else {
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageN)));
}
catch (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + packageN)));
}
}
Puede usar este comando para buscar los nombres de paquetes instalados en un dispositivo:
adb shell pm list packages -3 -f
Referencia: http://www.aftvnews.com/how-to-determine-the-package-name-of-an-android-app/
Si desea abrir otra aplicación y no está instalada, puede enviarla a la tienda de aplicaciones de Google para descargarla
Primero crea el método openOtherApp por ejemplo
public static boolean openApp(Context context, String packageName) { PackageManager manager = context.getPackageManager(); try { Intent intent = manager.getLaunchIntentForPackage(packageName); if (intent == null) { //the app is not installed try { intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setData(Uri.parse("market://details?id=" + packageName)); context.startActivity(intent); } catch (ActivityNotFoundException e) { //throw new ActivityNotFoundException(); return false; } } intent.addCategory(Intent.CATEGORY_LAUNCHER); context.startActivity(intent); return true; } catch (ActivityNotFoundException e) { return false; } }
2.- Uso
openOtherApp(getApplicationContext(), "com.packageappname");
Si está intentando iniciar un SERVICIO en lugar de actividad, esto funcionó para mí:
Intent intent = new Intent();
intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName");
context.startService(intent);
Si usa el método intent.setComponent (...) como se menciona en otras respuestas, puede recibir una advertencia de "Intentos implícitos con startService no es seguro".
Si ya tiene el nombre del paquete que desea activar, puede usar el siguiente código, que es un poco más genérico:
PackageManager pm = context.getPackageManager();
Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName);
if (null != appStartIntent)
{
context.startActivity(appStartIntent);
}
Descubrí que funciona mejor para los casos en los que la actividad principal no se encontró mediante el método habitual de iniciar la actividad PRINCIPAL.
Use lo siguiente:
String packagename = "com.example.app";
startActivity(getPackageManager().getLaunchIntentForPackage(packagename));
Utilizar esta :
PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage("com.package.name");
startActivity(intent);
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(ComponentName.unflattenFromString("com.google.android.maps.mytracks/com.google.android.apps.mytracks.MyTracks"));
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);
EDITAR:
como se sugiere en los comentarios, agregue una línea antes de startActivity(intent);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("package_name","package_name.class_name"));
intent.putExtra("grace", "Hi");
startActivity(intent);