अपने खुद के (इरादे) से एक और आवेदन खोलें


136

मुझे पता है कि मुझे अपने स्वयं के कार्यक्रमों को कैसे अपडेट करना है, और मुझे पता है कि पूर्वनिर्धारित उरी (उदाहरण के लिए एसएमएस या उदाहरण के लिए) का उपयोग करके प्रोग्राम कैसे खोलें

मुझे यह जानने की आवश्यकता है कि मैं MyTracks या किसी भी अन्य एप्लिकेशन को खोलने के लिए एक आशय कैसे बना सकता हूं जो मुझे नहीं पता कि वे किस इरादे से सुनते हैं।

मुझे डीडीएमएस से यह जानकारी मिली, लेकिन मैं इसे एक ऐसे इरादे में बदलने में सफल नहीं हुआ जिसका मैं उपयोग कर सकता हूं। यह 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)

जवाबों:


141

सबसे पहले, एंड्रॉइड में "एप्लिकेशन" की अवधारणा थोड़ी विस्तारित है।

एक आवेदन - तकनीकी रूप से एक प्रक्रिया - कई गतिविधियों, सेवाओं, सामग्री प्रदाताओं और / या श्रोताओं को प्रसारित कर सकती है। यदि उनमें से कम से कम एक चल रहा है, तो आवेदन ऊपर और चल रहा है (प्रक्रिया)।

तो, आपको जो पहचानना है वह यह है कि आप "एप्लिकेशन को कैसे शुरू करना चाहते हैं"।

ठीक है ... यहाँ आप क्या कोशिश कर सकते हैं:

  1. के साथ एक इरादा बनाएँ action=MAINऔरcategory=LAUNCHER
  2. जाओ PackageManagerवर्तमान संदर्भ से उपयोग करते हुएcontext.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0)जहां इरादा है category=LAUNCHER, action=MAINया packageManager.resolveActivity(<intent>, 0)मुख्य / लांचर के साथ पहली गतिविधि प्राप्त करना है
  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)

क्या होगा अगर मैं तीन अलग-अलग ऐप खोलना चाहता हूं?
Si8

7
नीचे दिए गए समुदाय विकी का उत्तर बेहतर है, यदि आप पैकेज का नाम stackoverflow.com/a/7596063/379115
मार्टिन बेलचर - 13

आप कॉलिंग ऐप और लॉन्च किए गए ऐप के बीच डेटा कैसे पास कर सकते हैं? मुझे 'Intent.putExtra ()' मिला है, लेकिन मुझे नहीं पता कि लॉन्च किए गए ऐप में अतिरिक्त डेटा कैसे प्राप्त किया जाए।
ब्रैम

onCreate=> Bundle extras = getIntent().getExtras()=> if(extras != null) { extras.getString("blah") }आदि
गौरव वैश्य

2
getPackageManager().getLaunchIntentForPackage()आपके लिए यह सब पहले से ही है। github.com/android/platform_frameworks_base/blob/master/core/…
jrub

231

मैंने इसे इस तरह से काम किया है,

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

उदाहरण उपयोग:

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

आशा है कि यह किसी की मदद करता है।


5
क्योंकि getLaunchIntentForPackage ("ऐप पैकेज नाम") अपवाद का कारण हो सकता है।
xtr

यह एक शानदार जवाब है, सरल अपवाद को पकड़ें और आपको जो कुछ भी चाहिए, उपयोगकर्ता को सूचित करें
IT-Dan

5
एक स्टिकर के रूप में नहीं, लेकिन getLaunchIntentForPackageकॉल के परिणाम का उपयोग करने के बाद पहली पंक्ति पर एक नई आशय आवंटित करने का कोई कारण नहीं है ।
क्रिस लैसी

2
getLaunchIntentForPackage()पहले से ही श्रेणी जोड़ता है, स्रोत देखें: github.com/android/platform_frameworks_base/blob/master/core/…
jrub

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

संपादित करें:

जैसा कि टिप्पणियों में सुझाया गया है, पहले एक पंक्ति जोड़ें startActivity(intent);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

18
लेकिन इसके लिए गतिविधि का नाम जानना आवश्यक है
njzk2

मैंने यह कोशिश की और FLAG_ACTIVITY_NEW_TASK ध्वज का उपयोग करने की अनुशंसा करने में त्रुटि हुई। मैंने इस लाइन को startActivity से पहले जोड़ा था और इसने काम किया: इरादे ।setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
दाविद-होज़े

1
@ njzk2 Google Play पर किसी चीज़ के लिए पैकेज का नाम खोजना आसान है; यह यूआरएल में वहीं है। उदाहरण के लिए: play.google.com/store/apps/…
Da-Jin

@iceybobby हाँ पैकेज का नाम ढूंढना आसान है, लेकिन आप लॉन्च करने के लिए गतिविधि का वर्ग नाम कैसे खोजते हैं?
फ़्रेकहेड

@phreakhead तुम सही हो। मुझे लगता है कि मैंने इस उत्तर में समाधान का उपयोग किया: stackoverflow.com/a/8944286/1224186 इसलिए गतिविधि नाम की आवश्यकता नहीं थी, और इसलिए मुझे लगता है कि यहाँ मेरा जवाब njzk2 के लिए बेकार है।
दा-जिन

39

यदि आपके पास पहले से ही पैकेज का नाम है जिसे आप सक्रिय करना चाहते हैं, तो आप निम्नलिखित कोड का उपयोग कर सकते हैं जो थोड़ा अधिक सामान्य है:

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

मैंने पाया कि यह उन मामलों के लिए बेहतर काम करता है जहाँ मुख्य गतिविधि मुख्य गतिविधि शुरू करने की नियमित विधि से नहीं मिली थी।


मेरे लिए सर्वश्रेष्ठ उत्तर :-) मेरे लिए उपयोगी। धन्यवाद
Jalpesh Khakhi

यह मेरे लिए एकदम सही है। बहुत बहुत धन्यवाद मुज़िकान्त:)
एलेक्स

13

यह मास्टरगौरव समाधान पर मेरे समाधान आधार का कोड है:

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

व्युत्क्रम से समाधान का उपयोग करते हुए, मैंने एक फ़ंक्शन के साथ स्निपेट का विस्तार किया, जिसे उस समय कहा जाएगा जब वांछित एप्लिकेशन इंस्टॉल नहीं किया गया हो। तो यह काम करता है: पैकेज नाम से रन एप्लिकेशन। यदि नहीं मिला, तो 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");

6

इसे इस्तेमाल करो :

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

कोई विचार है? मौजूदा ऐप्लिकेशन के अंदर डिवाइस स्टोर में इंस्टॉल किए जाने के बजाय एक test.apk खोलें। जब एक बटन दोपहर के भोजन के परीक्षण पर क्लिक करें। मौजूदा प्रोजेक्ट्स में संग्रहीत ऐप्स। अग्रिम धन्यवाद।
सेलिम रजा

6

मौजूद होने पर एप्लिकेशन खोलें या इसे इंस्टॉल करने के लिए 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)));
        }
    }
}

अगर (i! null) होना चाहिए
vallllll

4

मेरे आवेदन गतिविधि से एक और आवेदन गतिविधि शुरू करने के लिए। यह मेरे लिए ठीक काम कर रहा है।

नीचे दिया गया कोड काम करेगा यदि आपके फ़ोन में पहले से इंस्टॉल किया गया कोई अन्य एप्लिकेशन अन्यथा एक ऐप को दूसरे ऐप पर रीडायरेक्ट करना संभव नहीं है। सुनिश्चित करें कि आपका ऐप लॉन्च हुआ है या नहीं

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

कृपया ऐसे कई उत्तर न लिखें जो एक ही प्रश्न के लगभग समान हों। उत्तर के नीचे "संपादित करें" लिंक का उपयोग करें और मूल बदलें।
एड्रियनएचएच

3

// यह एंड्रॉइड लॉलीपॉप 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

चूंकि एप्लिकेशन को कई फ़ोन सेटिंग्स को बदलने की अनुमति नहीं है, आप किसी अन्य एप्लिकेशन की तरह ही सेटिंग गतिविधि खोल सकते हैं।

वास्तव में सेटिंग को मैन्युअल रूप से संशोधित करने के बाद आप लॉगकैट आउटपुट को देखें:

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
}

2

API स्तर 3+ के लिए, कोड की एक पंक्ति से अधिक कुछ नहीं:

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

CATEGORY_INFO लॉन्च इंटेंट (बिना लॉन्चर की गतिविधि वाले ऐप्स, उदाहरण के लिए वॉलपेपर, अक्सर ऐप के बारे में कुछ जानकारी प्रदान करने के लिए इसका उपयोग करें) और, यदि यह नहीं मिलता है, तो मौजूद है, CATEGORY_LAUNCH पैकेज का रिटर्न देता है।


2

यदि आप गतिविधि के बजाय सेवा शुरू करने का प्रयास कर रहे हैं, तो यह मेरे लिए काम कर रहा है:

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

यदि आप अन्य उत्तरों में बताए गए इरादे .setComponent (...) विधि का उपयोग करते हैं, तो आपको "सेन्सपर्ट सुरक्षित नहीं हैं" चेतावनी के साथ चेतावनी मिल सकती है।


2

वैकल्पिक रूप से आप दूसरे ऐप में भी अपने ऐप से इरादे खोल सकते हैं:

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

जहां uriअन्य एप्लिकेशन को deeplink है


2

निम्नलिखित का उपयोग करें:

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

2

Android पर किसी अन्य एप्लिकेशन से एप्लिकेशन लॉन्च करें

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

2

यदि आप कोई अन्य एप्लिकेशन खोलना चाहते हैं और यह इंस्टॉल नहीं है तो आप इसे Google ऐप स्टोर पर डाउनलोड करने के लिए भेज सकते हैं

  1. सबसे पहले उदाहरण के लिए OpenOtherApp विधि बनाएं

    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.- उपयोग

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

0

इस कोड को आज़माएं, आशा है कि यह आपकी मदद करेगा। अगर यह पैकेज उपलब्ध है तो यह ऐप को खोलेगा या फिर डाउनलोड के लिए प्ले स्टोर खोलेगा

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