एंड्रॉइड में किसी अन्य एप्लिकेशन से गतिविधि कैसे लॉन्च करें


478

मैं अपने एंड्रॉइड एप्लिकेशन से एक स्थापित पैकेज लॉन्च करना चाहता हूं। मुझे लगता है कि यह इंटेंट्स का उपयोग करना संभव है, लेकिन मुझे इसे करने का एक तरीका नहीं मिला। क्या कोई लिंक है, जहां जानकारी ढूंढनी है?


2
क्या होगा यदि मैं पहले एक से दूसरा ऐप खोलूं और फिर सीधे दूसरे ऐप के आइकन पर क्लिक करूँ, मुझे ऐप के दो उदाहरण मिलते हैं, जो कि अवांछित है। इसे कैसे प्रबंधित करें ??
राधे रात्रि

जवाबों:


707

यदि आप मुख्य गतिविधि को नहीं जानते हैं, तो एप्लिकेशन को लॉन्च करने के लिए पैकेज नाम का उपयोग किया जा सकता है।

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) { 
    startActivity(launchIntent);//null pointer check in case package name was not found
}

5
ऐसा करने का कोई कारण नहीं होगा? मुझे यह कम से कम काम करने के लिए नहीं मिला।
साइमन फोर्सबर्ग

22
यह एक नया इरादा शुरू करता है, जो पृष्ठभूमि में है उस एप्लिकेशन को फिर से शुरू करने के बारे में कैसे?
सलिल दुआ

3
@andep: यह मेरे लिए अच्छी तरह से काम करता है जब मैंने दो ऐप के बीच परीक्षण किया जो मैंने खुद बनाया। एक बार मुझे पता है कि पैकेज का नाम हमेशा काम करेगा, या क्या आपके ऐप को (मैनिफेस्ट या कहीं और) लॉन्च करने से रोकने का कोई तरीका है?
लियोनार्ड फेहान

2
@ लियोनार्ड: मेरी पहली धारणा, कि इसे हमेशा काम करना चाहिए, क्योंकि पैकेज के नाम सार्वजनिक होते हैं इसलिए कोई भी ऐप उन्हें पढ़ सकता है। आपके ऐप्स से मुझे लगता है कि आप यह निर्धारित नहीं कर सकते हैं कि इसे कहां से बुलाया गया है, लेकिन आपका ऐप यह निर्धारित कर सकता है कि इसे मुख्य गतिविधि के माध्यम से सेवाओं के माध्यम से कॉल नहीं किया जा सकता है।
andep

1
हां, यह अशक्त लौट सकता है। "वर्तमान कार्यान्वयन श्रेणी में एक मुख्य गतिविधि के लिए पहले दिखता है CATEGORY_INFO, और श्रेणी में एक मुख्य गतिविधि के लिए अगला CATEGORY_LAUNCHERरिटर्न नल न तो न तो पाया जाता है। "
शांत 12

239

मुझे पता है कि इसका उत्तर दिया जा चुका है लेकिन यहां बताया गया है कि मैंने कुछ इसी तरह से लागू किया है:

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

इससे भी बेहतर, यहाँ विधि है:

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

हटाया गया डुप्लिकेट कोड:

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

8
फेसबुक या ट्विटर प्रोफाइल पर इंटेंट शुरू करने के दौरान मुझे एक समस्या हो रही थी। वे एक नई गतिविधि के बजाय मेरे ऐप के अंदर खुल रहे थे। FLAG_ACTIVITY_NEW_TASK को जोड़ना तय है। धन्यवाद!
हैरी

4
कोई दिक्कत नहीं है! मुझे कुछ बहुत ही अचंभित करने की समस्या थी
जारेड बर्स

1
विधि मेरे लिए काम करती है, लेकिन कभी-कभी नया एप्लिकेशन खुला होता है और कॉलिंग गतिविधि अभी भी अग्रभूमि है। कैसे तय करने के लिए कोई विचार?
lgdroid57

क्या तत्काल-ऐप से ऐसा करने का कोई तरीका है?
महदी

केवल रिलीज़ संस्करण के लिए काम करता है। यदि आप डिबग ऐप खोलने का प्रयास कर रहे हैं, तो इरादा शून्य हो जाएगा।
RexSplode

152

मुझे इसका हल मिल गया। एप्लिकेशन की घोषणा फ़ाइल में मुझे पैकेज का नाम मिला: com.package.address और मुख्य गतिविधि का नाम जिसे मैं लॉन्च करना चाहता हूं: MainActivity निम्नलिखित कोड इस एप्लिकेशन को शुरू करता है:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.package.address","com.package.address.MainActivity"));
startActivity(intent);

8
मुझे अपवाद मिला 'खुराक आप अपने घोषणापत्र में गतिविधि की घोषणा करें।'
इज़हार

इस तरह से एक अपवाद मिलता है जो कहता है कि मुझे अपने प्रकटीकरण में गतिविधि को घोषित करने की आवश्यकता है .. लेकिन इसका बाहरी ऐप!
जे जे अब

इसे पृष्ठभूमि में कैसे चलाएं? इसका अर्थ है कि दूसरे एप्लिकेशन स्क्रीन पर दिखाई नहीं देते हैं, लेकिन इसकी ऑनक्रिएटेड () विधि चलाते हैं।
डॉ। जकी

मुझे यह त्रुटि तब होती है जब मैं तत्काल ऐप से कोशिश करता हूं: गतिविधि शुरू करने की अनुमति नहीं है इरादे
Mahdi

@Bastian वर्तमान ऐप को कैसे बंद करें जहां से हम दूसरे ऐप को खोलने का इरादा रखते हैं?
अर्नोल्ड ब्राउन

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

17

यदि कोई इसे उपयोगी पाता है, तो मैं अपने ऐप से बार / क्यूआर कोड स्कैनर लॉन्च करने का मेरा उदाहरण हूं

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

13

टिप्पणी के आधार पर संपादित करें

कुछ संस्करणों में - जैसा कि टिप्पणियों में सुझाया गया है - फेंक दिया गया अपवाद अलग हो सकता है।

इस प्रकार नीचे दिए गए समाधान को थोड़ा संशोधित किया गया है

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

मूल उत्तर

हालांकि अच्छी तरह से उत्तर दिया गया है, एक बहुत ही सरल कार्यान्वयन है जो ऐप को स्थापित नहीं होने पर संभालता है। मैं इसे इस तरह से करता हूं

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

"ApplicationId" को उस पैकेज से बदलें जो आप खोलना चाहते हैं जैसे com.google.maps, आदि।


PackageManager.getLaunchIntentForPackage(...)विधि रिटर्न शून्य अगर पैकेज का नाम पहचाना नहीं गया है। यह फेंकता नहीं है PackageManager.NameNotFoundException। देखें यहाँ
आदिल हुसैन

मैंने सिर्फ startActivity(null)एक एंड्रॉइड 10 एमुलेटर पर कोशिश की और यह ए NullPointerExceptionऔर फेंकता है ए नहीं PackageManager.NameNotFoundException
आदिल हुसैन

मेरे नोट 7 पर यह ठीक उसी तरह से काम करता है जिस तरह इसका इरादा है।
मयंक 1513

startActivity(Intent intent)जब इसे शून्य दिया जाता है तो विधि का इच्छित व्यवहार क्या होता है Intentऔर आप क्या कहते हैं? एंड्रॉइड डेवलपर्स के दस्तावेज़ केवल यह कहते हैं कि यह एक फेंक देगा ActivityNotFoundException
आदिल हुसैन

हाय @ आदिल क्या आप मुझे इस सवाल में मदद कर सकते हैं - stackoverflow.com/q/59615815/9640177
mayank1513

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

        }

    }

वहाँ uri.parse विधि के लिए एक चरित्र सीमा है?
एपीआई

7

यदि आप किसी अन्य एप्लिकेशन की विशिष्ट गतिविधि खोलना चाहते हैं तो हम इसका उपयोग कर सकते हैं।

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

यदि आपको अन्य एप्लिकेशन की आवश्यकता है, तो टोस्ट दिखाने के बजाय आप एक संवाद दिखा सकते हैं। संवाद का उपयोग करके आप आवश्यक एप्लिकेशन डाउनलोड करने के लिए उपयोगकर्ता को Play-Store पर ला सकते हैं।


com.android.settings.fuelgauge.PowerUsageSummaryकेवल एक गतिविधि-उर्फ है com.android.settings.Settings$PowerUsageSummaryActivity, और इसे एंड्रॉइड पाई में हटा दिया गया था , इसलिए मैंने इस उत्तर सूट पाई को बनाने के लिए संपादन को प्रस्तुत किया। ध्यान दें कि यह भी पुराने संस्करण के साथ संगत है, नवम्बर 10, 2011 af9252849fd94c1f2859c56a4010900ea38a607e आदि पर AOSP प्रतिबद्ध देख
सप्ताहांत

3

यदि आप डेटा जानते हैं और इंस्टॉल किए गए पैकेज पर कार्रवाई करते हैं, तो आपको इसे शुरू करने से पहले बस इन सूचनाओं को अपने इरादे में जोड़ना चाहिए।

यदि आपके पास अन्य ऐप के AndroidManifest तक पहुंच है, तो आप वहां सभी आवश्यक जानकारी देख सकते हैं।


1
उत्तर के लिए धन्यवाद। हां मेरे पास अन्य एप्लिकेशन का AndroidManifest है। अब मैं जो करने की कोशिश कर रहा हूं, वह निम्नलिखित कोड है: इरादे का इरादा = नया इरादा (इरादे ।ACTION_MAIN); आशय .setComponent (नया घटक नाम ("com.package", "MainActivity")); startActivity (आशय); लेकिन इस तरह से यह काम नहीं कर रहा है। क्या आप मुझे अधिक सटीक लिंक दे सकते हैं, कैसे करें?
बैस्टियन

1
अनुप्रयोग "startActivity ..." लाइन पर क्रैश हो जाता है: आवेदन अप्रत्याशित रूप से बंद हो गया है। फिर से कोशिश करें। मुझे LogCat में त्रुटि कहां दिखाई दे सकती है?
बैस्टियन

5
मुझे त्रुटि मिली: घटक सेट करते समय, केवल कक्षा के बजाय पूरी तरह से योग्य वर्ग का नाम रखना होगा: इरादे की जगह। .setComponent (नया घटक नाम ("com.package", "MainActivity"))
बैस्टियन

1
पता करने के लिए अच्छा है ... आप ग्रहण पर LogCat पा सकते हैं: विंडो> शो देखें> अन्य, Android> Logcat
WarrenFaith

@WarrenFaith मुझे stackoverflow.com/questions/52335402/… के साथ समर्थन की आवश्यकता है कृपया मदद करें।
user158

2

निम्नानुसार नई गतिविधि शुरू करने के लिए कदम:

1. पैकेज के लिए इरादा है

2. अगर इरादा प्लेस्टोर पर अशक्त पुनर्निर्देशित उपयोगकर्ता है

3. यदि इरादे शून्य खुली गतिविधि नहीं है

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

2

उपयोग करके ऐप की गतिविधि शुरू करना संभव है Intent.setClassNameडॉक्स के अनुसार ।

एक उदाहरण:

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)

वर्तमान ऐप के बाहर इसे खोलने के लिए, इरादा शुरू करने से पहले इस ध्वज को जोड़ें।

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

एक संबंधित जवाब यहाँ


pls C ++ में कैसे लिखें।
16

1
@GeneCode stackoverflow.com/a/22436147/8608146 इससे पहले मैंने कभी भी Android में c ++ libs के साथ काम नहीं किया।
फणी ऋत्विज

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.