Buka aplikasi lain dari (maksud) Anda sendiri


136

Saya tahu cara memperbarui program saya sendiri, dan saya tahu cara membuka program menggunakan Uri yang telah ditentukan (untuk sms atau email misalnya)

Saya perlu tahu bagaimana cara membuat Intent untuk membuka MyTracks atau aplikasi lain yang saya tidak tahu maksud apa yang mereka dengarkan.

Saya mendapatkan info ini dari DDMS, tetapi saya belum berhasil mengubahnya menjadi Intent yang dapat saya gunakan. Ini diambil dari saat membuka MyTracks secara manual.

Terima kasih atas bantuan Anda

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)

Jawaban:


141

Pertama, konsep "aplikasi" di Android sedikit diperpanjang.

Aplikasi - secara teknis merupakan proses - dapat memiliki banyak aktivitas, layanan, penyedia konten, dan / atau pendengar siaran. Jika setidaknya salah satu dari mereka sedang berjalan, aplikasi sudah aktif dan berjalan (proses).

Jadi, yang harus Anda identifikasi adalah bagaimana Anda ingin "memulai aplikasi".

Oke ... inilah yang bisa Anda coba:

  1. Buat maksud dengan action=MAINdancategory=LAUNCHER
  2. Dapatkan PackageManagerdari konteks saat ini menggunakancontext.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)di mana maksud memiliki category=LAUNCHER, action=MAINatau packageManager.resolveActivity(<intent>, 0)untuk mendapatkan aktivitas pertama dengan main / launcher
  4. Dapatkan yang ActivityInfoAnda minati
  5. Dari ActivityInfo, dapatkan packageNamedanname
  6. Akhirnya, membuat niat lain dengan dengan category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name)dansetFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Akhirnya, context.startActivity(newIntent)

Bagaimana jika saya ingin membuka tiga aplikasi terpisah?
Si8

7
Jawaban wiki komunitas di bawah lebih baik, jika Anda tahu nama paket stackoverflow.com/a/7596063/379115
Martin Belcher - AtWrk

Bagaimana Anda bisa meneruskan data antara aplikasi panggilan dan aplikasi yang diluncurkan? Saya telah menemukan 'Intent.putExtra ()' tetapi saya tidak tahu cara mengambil data tambahan di aplikasi yang diluncurkan.
Bram

onCreate=> Bundle extras = getIntent().getExtras()=> if(extras != null) { extras.getString("blah") }dll
Gaurav Vaish

2
getPackageManager().getLaunchIntentForPackage()sudah melakukan semua itu untuk Anda github.com/android/platform_frameworks_base/blob/master/core/…
jrub

233

Saya memiliki pekerjaan seperti ini,

/** 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;
    }
}

Contoh penggunaan:

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

Semoga bisa membantu seseorang.


5
karena getLaunchIntentForPackage ("app package name") dapat menyebabkan pengecualian.
xtr

Ini adalah jawaban yang bagus, tangkap pengecualian dan lakukan apa yang Anda butuhkan, beri tahu pengguna, dll.
IT-Dan

5
Tidak terlalu kaku, tetapi tidak ada alasan untuk mengalokasikan Intent baru di baris pertama jika Anda menggunakan hasil getLaunchIntentForPackagepanggilan tersebut.
Chris Lacy

2
getLaunchIntentForPackage()sudah menambahkan kategori, lihat sumber: github.com/android/platform_frameworks_base/blob/master/core/…
jrub

Satu-satunya masalah bagi saya adalah Contextobjek di mana / bagaimana cara mendapatkannya / membuatnya? Dan paket apa yang akan diimpor. Baru di Java untuk pengembangan Android.
Aleksey Kontsevich

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

EDIT:

seperti yang disarankan dalam komentar, tambahkan satu baris sebelumnya startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

18
tetapi perlu diketahui nama aktivitasnya
njzk2

Saya mencoba ini dan mendapat kesalahan saat merekomendasikan untuk menggunakan bendera FLAG_ACTIVITY_NEW_TASK. Saya menambahkan baris ini sebelum startActivity dan berhasil: intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
david-hoze

1
@ njzk2 menemukan nama paket untuk sesuatu di Google Play itu mudah; itu ada di sana di URL. Misalnya: play.google.com/store/apps/…
Da-Jin

@iceybobby ya nama paketnya mudah ditemukan, tetapi bagaimana Anda menemukan nama kelas dari aktivitas yang akan diluncurkan?
phreakhead

@phreakhead Anda benar. Saya rasa saya menggunakan solusi dalam jawaban ini: stackoverflow.com/a/8944286/1224186 jadi nama aktivitas tidak diperlukan, jadi saya pikir itu membuat balasan saya ke njzk2 tidak membantu di sini.
Da-Jin

39

Jika Anda sudah memiliki nama paket yang ingin Anda aktifkan, Anda dapat menggunakan kode berikut yang sedikit lebih umum:

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

Saya menemukan bahwa ini bekerja lebih baik untuk kasus-kasus di mana aktivitas utama tidak ditemukan oleh metode reguler untuk memulai aktivitas MAIN.


Jawaban Terbaik untuk saya :-) sangat membantu saya. Terima kasih
Jalpesh Khakhi

Itu sempurna untukku. Terima kasih banyak Muzikant :)
Alex

13

Ini adalah kode solusi saya berdasarkan solusi 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();
    }
}

10

Menggunakan solusi dari inversus, saya memperluas potongan dengan fungsi, yang akan dipanggil ketika aplikasi yang diinginkan tidak diinstal saat ini. Jadi itu bekerja seperti: Jalankan aplikasi dengan nama paket. Jika tidak ditemukan, buka pasar Android - Google play untuk paket ini .

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

Dan itu digunakan seperti ini:

startApplication("org.teepee.bazant");

6

Gunakan ini :

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

Punya ide? buka test.apk alih-alih diinstal di toko perangkat di dalam aplikasi yang ada. petunjuk saat mengklik tombol aplikasi test.apk makan siang yang disimpan dalam proyek yang ada. terima kasih sebelumnya.
Selim Raza

6

Buka aplikasi jika ada, atau buka aplikasi Play Store untuk menginstalnya:

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

harus jika (i! = null)
vallllll

4

Memulai aktivitas aplikasi lain dari Aktivitas aplikasi saya. Ini bekerja dengan baik untuk saya.

Kode di bawah ini akan berfungsi jika aplikasi lain sudah diinstal di ponsel Anda, jika tidak, tidak mungkin untuk mengalihkan dari satu aplikasi ke aplikasi lain. Jadi pastikan aplikasi Anda diluncurkan atau tidak

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

Harap jangan menulis beberapa jawaban yang hampir identik dengan pertanyaan yang sama. Gunakan link "edit" di bawah jawaban dan ubah aslinya.
AdrianHHH

3

// Ini berfungsi di 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;
}

2

Karena aplikasi tidak diizinkan untuk mengubah banyak pengaturan telepon, Anda dapat membuka aktivitas pengaturan seperti aplikasi lain.

Lihatlah keluaran LogCat Anda setelah Anda benar-benar mengubah pengaturan secara manual:

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

Kemudian gunakan ini untuk menampilkan halaman pengaturan dari aplikasi Anda:

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
}

2

Untuk API level 3+, tidak lebih dari satu baris kode:

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

Kembalikan Intent peluncuran CATEGORY_INFO (aplikasi tanpa aktivitas peluncur, wallpaper misalnya, sering menggunakan ini untuk memberikan beberapa informasi tentang aplikasi) dan, jika tidak menemukannya, mengembalikan CATEGORY_LAUNCH paket, jika ada.


2

Jika Anda mencoba memulai SERVICE daripada aktivitas, ini berhasil untuk saya:

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

Jika Anda menggunakan metode intent.setComponent (...) seperti yang disebutkan dalam jawaban lain, Anda mungkin mendapatkan peringatan "Maksud implisit dengan startService tidak aman".


2

Alternatifnya, Anda juga bisa membuka maksud dari aplikasi Anda di aplikasi lain dengan:

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

di mana uritautan dalam ke aplikasi lain


2

Gunakan berikut ini:

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

2

Luncurkan aplikasi dari aplikasi lain di Android

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

2

Jika Anda ingin membuka aplikasi lain dan tidak terpasang, Anda dapat mengirimkannya ke Google App Store untuk diunduh

  1. Pertama buat metode openOtherApp misalnya

    public static boolean openOtherApp(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.- Penggunaan

openOtherApp(getApplicationContext(), "com.packageappname");

0

Coba kode ini, Semoga ini bisa membantu Anda. Jika paket ini tersedia maka ini akan membuka aplikasi atau membuka play store untuk mengunduh

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


-3
Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setComponent(new ComponentName("package_name","package_name.class_name"));
        intent.putExtra("grace", "Hi");
        startActivity(intent);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.