Откройте другое приложение с вашего собственного (намеренного)

Я знаю, как обновлять свои собственные программы, и я знаю, как открывать программы, используя предопределенный Uri (например, для смс или электронной почты)

Мне нужно знать, как я могу создать намерение открыть MyTracks или любое другое приложение, которое я не знаю, какие намерения они слушают.

Я получил эту информацию от DDMS, но я не добился успеха в том, чтобы превратить это в намерение, которое я могу использовать. Это берется при открытии MyTracks вручную.

Спасибо за вашу помощь

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) 

Solutions Collecting From Web of "Откройте другое приложение с вашего собственного (намеренного)"

Во-первых, понятие «приложение» в Android немного расширенное.

Приложение – технически процесс – может иметь несколько действий, услуг, поставщиков контента и / или широковещательных слушателей. Если хотя бы один из них запущен, приложение запускается и запускается (процесс).

Итак, что вам нужно определить, как вы хотите «запустить приложение».

Хорошо … вот что вы можете попробовать:

  1. Создайте намерение с action=MAIN и category=LAUNCHER
  2. Получите PackageManager из текущего контекста, используя context.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0) где у цели есть category=LAUNCHER , action=MAIN или packageManager.resolveActivity(<intent>, 0) чтобы получить первое действие с помощью main / launcher
  4. Получить интересующую вас информацию ActivityInfo
  5. Из ActivityInfo получите имя packageName и name
  6. Наконец, создайте еще одно намерение с помощью category=LAUNCHER , action=MAIN , componentName = new ComponentName(packageName, name) и setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Наконец, context.startActivity(newIntent)

Я работаю так,

 /** 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 PackageManager.NameNotFoundException(); } i.addCategory(Intent.CATEGORY_LAUNCHER); context.startActivity(i); return true; } catch (PackageManager.NameNotFoundException e) { return false; } } 

Пример использования:

 openApp(this, "com.google.android.maps.mytracks"); 

Надеюсь, это поможет кому-то.

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

РЕДАКТИРОВАТЬ :

Как предлагается в комментариях, добавьте одну строку до startActivity(intent);

 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

Если у вас уже есть имя пакета, которое вы хотите активировать, вы можете использовать следующий код, который является более общим:

 PackageManager pm = context.getPackageManager(); Intent appStartIntent = pm.getLaunchIntentForPackage(appPackageName); if (null != appStartIntent) { context.startActivity(appStartIntent); } 

Я обнаружил, что он работает лучше для случаев, когда основное действие не было обнаружено обычным методом запуска основной деятельности.

Это код моей базы решений на решении 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(); } } 

Используя решение от inversus, я расширил фрагмент с помощью функции, которая будет вызываться, когда требуемое приложение не будет установлено в данный момент. Таким образом, он работает так: Запустите приложение по имени пакета. Если не найден, откройте Android-рынок – Google для этого пакета .

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

И он используется следующим образом:

 startApplication("org.teepee.bazant"); 

Откройте приложение, если оно существует, или откройте приложение Play Store для его установки:

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

Использовать это :

  PackageManager pm = getPackageManager(); Intent intent = pm.getLaunchIntentForPackage("com.package.name"); startActivity(intent); 

Запустить другую активность приложения из моего приложения «Активность». Это отлично работает для меня.

Ниже код будет работать, если другое приложение уже установлено на вашем телефоне, иначе невозможно перенаправить одно приложение в другое приложение. Убедитесь, что ваше приложение запущено или нет.

 Intent intent = new Intent(); intent.setClassName("com.xyz.myapplication", "com.xyz.myapplication.SplashScreenActivity"); startActivity(intent); 

// Это работает на 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; } 

Поскольку приложениям не разрешено изменять многие параметры телефона, вы можете открыть активность настроек так же, как и другое приложение.

Посмотрите на результат LogCat после фактического изменения настройки вручную:

 INFO/ActivityManager(1306): Starting activity: Intent { act=android.intent.action.MAIN cmp=com.android.settings/.DevelopmentSettings } from pid 1924 

Затем используйте это, чтобы отобразить страницу настроек из вашего приложения:

 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 } 

Для уровня API 3+ не более одной строки кода:

Intent intent = context.getPackageManager().getLaunchIntentForPackage("name.of.package");

Верните запуск CATEGORY_INFO Intent (приложения без активности запуска, например, обои, часто используют это, чтобы предоставить некоторую информацию о приложении), и, если его не найти, возвращает CATEGORY_LAUNCH пакета, если он существует.

Если вы пытаетесь запустить SERVICE, а не активность, это сработало для меня:

 Intent intent = new Intent(); intent.setClassName("com.example.otherapplication", "com.example.otherapplication.ServiceName"); context.startService(intent); 

Если вы используете метод intent.setComponent (…), как указано в других ответах, вы можете получить предупреждение «Неявные намерения с startService небезопасными».

Кроме того, вы также можете открыть намерение своего приложения в другом приложении:

 Intent intent = new Intent(Intent.ACTION_VIEW, uri); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

Где uri является debplink для другого приложения

Используйте следующее:

 String packagename = "com.example.app"; startActivity(getPackageManager().getLaunchIntentForPackage(packagename)); 

Запустить приложение из другого приложения на Android

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage"); startActivity(launchIntent); 

Использование намерения для другого действия. Эта ссылка очень полезна для использования намерения для одной страницы для

Другая страница.

http://blogingtutorials.blogspot.com/2010/11/using-intent-in-android-one-page-to.html

Если возникнут какие-либо трудности, пришлите мне обратную связь. Я решаю эту проблему.

Попробуйте этот код, надеюсь, это вам поможет. Если этот пакет доступен, это откроет приложение или откроет магазин воспроизведения для загрузки

  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))); } } 
 Intent intent = new Intent(Intent.ACTION_MAIN); intent.setComponent(new ComponentName("package_name","package_name.class_name")); intent.putExtra("grace", "Hi"); startActivity(intent);