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)
AndersWid
sumber

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)
Gaurav Vaish
sumber
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.

Anonsage
sumber
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);
zawhtut.dll
sumber
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.

Muzikant
sumber
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();
    }
}
inversus
sumber
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");
peter.bartos
sumber
6

Gunakan ini :

    PackageManager pm = getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage("com.package.name");
    startActivity(intent);
Swetha
sumber
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)));
        }
    }
}
Flinbor
sumber
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);
KCN
sumber
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;
}
Anil Kongovi
sumber
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
}
Tary
sumber
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.

Renascienza
sumber
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".

Dunc
sumber
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

electrobabe.dll
sumber
2

Gunakan berikut ini:

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

Luncurkan aplikasi dari aplikasi lain di Android

  Intent launchIntent = getActivity.getPackageManager().getLaunchIntentForPackage("com.ionicframework.uengage");
        startActivity(launchIntent);
Ashutosh Srivastava
sumber
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");
Vladimir Salguero
sumber
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)));
                }
            }
AMAN SINGH
sumber
-3
Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setComponent(new ComponentName("package_name","package_name.class_name"));
        intent.putExtra("grace", "Hi");
        startActivity(intent);
Manzer
sumber