Voglio lanciare un pacchetto installato dalla mia applicazione Android. Presumo che sia possibile usare gli intenti, ma non ho trovato il modo di farlo. Esiste un link, dove trovare le informazioni?
Voglio lanciare un pacchetto installato dalla mia applicazione Android. Presumo che sia possibile usare gli intenti, ma non ho trovato il modo di farlo. Esiste un link, dove trovare le informazioni?
Risposte:
Se non si conosce l'attività principale, è possibile utilizzare il nome del pacchetto per avviare l'applicazione.
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) {
startActivity(launchIntent);//null pointer check in case package name was not found
}
CATEGORY_INFO
, e successivamente un'attività principale nella categoria CATEGORY_LAUNCHER
. Restituisce null se nessuno dei due viene trovato. "
So che è stata data una risposta, ma ecco come ho implementato qualcosa di simile:
Intent intent = getPackageManager().getLaunchIntentForPackage("com.package.name");
if (intent != null) {
// We found the activity now start the activity
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} else {
// Bring user to the market or let them choose an app?
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + "com.package.name"));
startActivity(intent);
}
Ancora meglio, ecco il metodo:
public void startNewActivity(Context context, String packageName) {
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
if (intent != null) {
// We found the activity now start the activity
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
} else {
// Bring user to the market or let them choose an app?
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + packageName));
context.startActivity(intent);
}
}
Codice duplicato rimosso:
public void startNewActivity(Context context, String packageName) {
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
if (intent == null) {
// Bring user to the market or let them choose an app?
intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=" + packageName));
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
Ho trovato la soluzione Nel file manifest dell'applicazione ho trovato il nome del pacchetto: com.package.address e il nome dell'attività principale che voglio avviare: MainActivity Il seguente codice avvia questa applicazione:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.package.address","com.package.address.MainActivity"));
startActivity(intent);
// in onCreate method
String appName = "Gmail";
String packageName = "com.google.android.gm";
openApp(context, appName, packageName);
public static void openApp(Context context, String appName, String packageName) {
if (isAppInstalled(context, packageName))
if (isAppEnabled(context, packageName))
context.startActivity(context.getPackageManager().getLaunchIntentForPackage(packageName));
else Toast.makeText(context, appName + " app is not enabled.", Toast.LENGTH_SHORT).show();
else Toast.makeText(context, appName + " app is not installed.", Toast.LENGTH_SHORT).show();
}
private static boolean isAppInstalled(Context context, String packageName) {
PackageManager pm = context.getPackageManager();
try {
pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException ignored) {
}
return false;
}
private static boolean isAppEnabled(Context context, String packageName) {
boolean appStatus = false;
try {
ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packageName, 0);
if (ai != null) {
appStatus = ai.enabled;
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return appStatus;
}
Ecco il mio esempio di avvio della barra / scanner di codici QR dalla mia app se qualcuno lo trova utile
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.setPackage("com.google.zxing.client.android");
try
{
startActivityForResult(intent, SCAN_REQUEST_CODE);
}
catch (ActivityNotFoundException e)
{
//implement prompt dialog asking user to download the package
AlertDialog.Builder downloadDialog = new AlertDialog.Builder(this);
downloadDialog.setTitle(stringTitle);
downloadDialog.setMessage(stringMessage);
downloadDialog.setPositiveButton("yes",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialogInterface, int i)
{
Uri uri = Uri.parse("market://search?q=pname:com.google.zxing.client.android");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
try
{
myActivity.this.startActivity(intent);
}
catch (ActivityNotFoundException e)
{
Dialogs.this.showAlert("ERROR", "Google Play Market not found!");
}
}
});
downloadDialog.setNegativeButton("no",
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int i)
{
dialog.dismiss();
}
});
downloadDialog.show();
}
Modifica in base al commento
In alcune versioni - come suggerito nei commenti - l'eccezione generata potrebbe essere diversa.
Pertanto la soluzione seguente è leggermente modificata
Intent launchIntent = null;
try{
launchIntent = getPackageManager().getLaunchIntentForPackage("applicationId");
} catch (Exception ignored) {}
if(launchIntent == null){
startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
} else {
startActivity(launchIntent);
}
Risposta originale
Sebbene abbia una buona risposta, esiste un'implementazione piuttosto semplice che gestisce se l'app non è installata. Lo faccio così
try{
startActivity(getPackageManager().getLaunchIntentForPackage("applicationId"));
} catch (PackageManager.NameNotFoundException e) {
startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
}
Sostituisci "applicationId" con il pacchetto che vuoi aprire come com.google.maps, ecc.
PackageManager.getLaunchIntentForPackage(...)
metodo restituisce null se il nome del pacchetto non è riconosciuto. Non getta PackageManager.NameNotFoundException
. Vedi qui .
startActivity(null)
un emulatore di Android 10 e genera un NullPointerException
e non un PackageManager.NameNotFoundException
.
startActivity(Intent intent)
metodo quando viene dato un null Intent
e cosa te lo fa dire? La documentazione degli sviluppatori Android afferma solo che lancerà un ActivityNotFoundException
.
// check for the app if it exist in the phone it will lunch it otherwise, it will search for the app in google play app in the phone and to avoid any crash, if no google play app installed in the phone, it will search for the app in the google play store using the browser :
public void onLunchAnotherApp() {
final String appPackageName = getApplicationContext().getPackageName();
Intent intent = getPackageManager().getLaunchIntentForPackage(appPackageName);
if (intent != null) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} else {
onGoToAnotherInAppStore(intent, appPackageName);
}
}
public void onGoToAnotherInAppStore(Intent intent, String appPackageName) {
try {
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + appPackageName));
startActivity(intent);
} catch (android.content.ActivityNotFoundException anfe) {
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("http://play.google.com/store/apps/details?id=" + appPackageName));
startActivity(intent);
}
}
Se vuoi aprire un'attività specifica di un'altra applicazione, possiamo usarla.
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
final ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.fuelgauge.PowerUsageSummary");
intent.setComponent(cn);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try
{
startActivity(intent)
}catch(ActivityNotFoundException e){
Toast.makeText(context,"Activity Not Found",Toast.LENGTH_SHORT).show()
}
Se hai bisogno di altre applicazioni, invece di mostrare Toast puoi mostrare una finestra di dialogo. Utilizzando la finestra di dialogo è possibile portare l'utente nel Play-Store per scaricare l'applicazione richiesta.
com.android.settings.fuelgauge.PowerUsageSummary
è solo un alias di attivitàcom.android.settings.Settings$PowerUsageSummaryActivity
ed è stato rimosso in Android Pie , quindi ho completato la modifica per rendere questa risposta adatta a Pie. Si noti che è anche compatibile con la versione precedente, vedere AOSP commit il 10 novembre 2011 af9252849fd94c1f2859c56a4010900ea38a607e ecc.
Se conosci i dati e l'azione su cui reagiscono i pacchetti installati, devi semplicemente aggiungere queste informazioni all'istanza di intento prima di avviarle.
Se hai accesso ad AndroidManifest dell'altra app, puoi vedere tutte le informazioni necessarie lì.
I passaggi per avviare una nuova attività come segue:
1. Ottenere l'intento per il pacchetto
2.Se l'intento è un utente di reindirizzamento null al Playstore
3.Se l'intento non è un'attività aperta nulla
public void launchNewActivity(Context context, String packageName) {
Intent intent = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.CUPCAKE) {
intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
}
if (intent == null) {
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 (android.content.ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + packageName)));
}
} else {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
È possibile avviare l'attività di un'app utilizzando Intent.setClassName
secondo i documenti.
Un esempio:
val activityName = "com.google.android.apps.muzei.MuzeiActivity" // target activity name
val packageName = "net.nurik.roman.muzei" // target package's name
val intent = Intent().setClassName(packageName, activityName)
startActivity(intent)
Per aprirlo al di fuori dell'app corrente, aggiungi questo flag prima di iniziare l'intento.
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
Una risposta correlata qui
private fun openOtherApp() {
val sendIntent = packageManager.getLaunchIntentForPackage("org.mab.dhyanaqrscanner")
startActivity(sendIntent)
finishAffinity()
}