অ্যান্ড্রয়েডে অন্য অ্যাপ্লিকেশন থেকে কীভাবে কোনও কার্যকলাপ চালু করা যায় launch


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
@ অ্যান্ডেপ: আমি নিজের তৈরি করা দুটি অ্যাপের মধ্যে যখন পরীক্ষা করেছি তখন এটি আমার পক্ষে ভাল কাজ করেছে। আমি একবার জানলে প্যাকেজের নামটি সর্বদা কার্যকর হবে, বা আপনার অ্যাপ্লিকেশন (ম্যানিস্টেস্ট বা অন্য কোথাও) চালু করতে কাউকে বাধা দেওয়ার কোনও উপায় আছে?
লিওনার্ড ফেহান

2
@ লিওনার্ড: আমার প্রথম ধারণা, এটি সর্বদা কার্যকর হওয়া উচিত কারণ প্যাকেজের নামগুলি সর্বজনীন তাই যে কোনও অ্যাপগুলি সেগুলি পড়তে পারে। আপনার অ্যাপ্লিকেশনগুলি থেকে আমার মনে হয় আপনি এটি নির্ধারণ করতে পারবেন না কোথা থেকে বলা হয়েছিল তবে আপনার অ্যাপ্লিকেশন নির্ধারণ করতে পারে যে কেবল পরিষেবাগুলির মাধ্যমে এটি মূল ক্রিয়াকলাপের মাধ্যমে কল করা যাবে না।
andep

1
হ্যাঁ, এটি শূন্য ফিরে আসতে পারে। "বিভাগের মধ্যে একটি প্রধান কার্যকলাপ জন্য বর্তমান বাস্তবায়ন সৌন্দর্য প্রথম CATEGORY_INFO, এবং বিভাগ একটি প্রধান কার্যকলাপ জন্য পরবর্তী CATEGORY_LAUNCHERরিটার্নস নাল যদি তন্ন তন্ন পাওয়া যায়। "
quietmint

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

তাত্ক্ষণিক অ্যাপ্লিকেশন থেকে এটি করার কোনও উপায় আছে?
মাহদি

শুধুমাত্র প্রকাশ সংস্করণের জন্য কাজ করে। আপনি যদি ডিবাগ অ্যাপ্লিকেশনটি খোলার চেষ্টা করছেন তবে অভিপ্রায়টি শূন্য হবে।
রেক্সস্প্লোড

152

আমি সমাধান খুঁজে পেয়েছি। অ্যাপ্লিকেশনটির ম্যানিফেস্ট ফাইলটিতে আমি প্যাকেজের নাম পেয়েছি: com.package.address এবং আমি যে প্রধান ক্রিয়াকলাপটি চালু করতে চাই তার নাম: মেইনএকটিভিটি নীচের কোডটি এই অ্যাপ্লিকেশনটি শুরু করে:

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

8
আমি ব্যতিক্রম পেয়েছি 'আপনি নিজের ম্যানিফেস্ট.এক্সএমএলটিতে কার্যকলাপ ঘোষণা করেছেন'
Itzhar

এইভাবে একটি ব্যতিক্রম ফিরে আসে যা বলে যে আমার প্রকাশ্য ক্রিয়াকলাপটি আমার প্রকাশ করা দরকার .. তবে এটি একটি বাহ্যিক অ্যাপ্লিকেশন!
জেজে আব

কীভাবে এটি পটভূমিতে চালাবেন? দ্বিতীয় কলিত অ্যাপ্লিকেশনগুলি স্ক্রিনে প্রদর্শিত হয় না, তবে এটির অনক্রিটেড () পদ্ধতি চালায়।
ডাঃ জ্যাকি

আমি তাত্ক্ষণিক অ্যাপ্লিকেশন থেকে চেষ্টা করার সময় আমি এই ত্রুটিটি পেয়েছি: ক্রিয়াকলাপ শুরু করার অনুমতি নেই ইন্টেন্ট
মাহদি

@ বাস্টিয়ান কীভাবে বর্তমান অ্যাপটি বন্ধ করবেন যেখানে আমরা অন্য অ্যাপ্লিকেশনটি খোলার অভিপ্রায় বলি?
আর্নল্ড ব্রাউন

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

কেউ যদি এটির কাজে লাগে তবে আমার অ্যাপ থেকে বার / কিউআর কোড স্ক্যানার চালু করার উদাহরণটি example

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

আপনি যে প্যাকেজটি খুলতে চান তার সাথে "অ্যাপ্লিকেশনআইড" প্রতিস্থাপন করুন যেমন com.google.maps ইত্যাদি open


PackageManager.getLaunchIntentForPackage(...)পদ্ধতি নাল ফেরৎ যদি প্যাকেজের নাম স্বীকৃত নয়। এটা ছুঁড়ে না PackageManager.NameNotFoundExceptionএখানে দেখুন ।
আদিল হুসেন

আমি কেবল startActivity(null)একটি অ্যান্ড্রয়েড 10 এমুলেটর চেষ্টা করেছি এবং এটি একটি NullPointerExceptionএবং একটি নয় PackageManager.NameNotFoundException
আদিল হুসেন

আমার নোট 7 এ এটি ঠিক যেমনভাবে কাজ করছে ঠিক সেভাবে কাজ করে।
mayank1513 13

startActivity(Intent intent)পদ্ধতিটি যখন বাতিল হয়ে যায় তখন তার উদ্দেশ্যপূর্ণ আচরণটি কী Intentএবং আপনাকে কী বলে? অ্যান্ড্রয়েড বিকাশকারীদের ডকুমেন্টেশন কেবল বলে যে এটি একটি নিক্ষেপ করবে ActivityNotFoundException
আদিল হুসেন

- হাই @Adil আপনি আমাকে এই প্রশ্নের সঙ্গে সাহায্য করুন করতে পারেন 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 পদ্ধতিতে কি চরিত্রের সীমা আছে?
এপিআই 21

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

আপনার যদি অন্য অ্যাপ্লিকেশন দরকার হয় তবে টোস্ট না দেখানোর পরিবর্তে আপনি একটি ডায়ালগ প্রদর্শন করতে পারেন। ডায়ালগ ব্যবহার করে আপনি প্রয়োজনীয় অ্যাপ্লিকেশনটি ডাউনলোড করতে ব্যবহারকারীকে প্লে-স্টোরে আনতে পারেন।


com.android.settings.fuelgauge.PowerUsageSummaryশুধু একটি নয় কার্যকলাপ-ওরফে এর com.android.settings.Settings$PowerUsageSummaryActivity, এবং এটি ছিল অ্যান্ড্রয়েড পাই সরানো , তাই আমি সম্পাদন করা এই উত্তর মামলা পাই করতে summitted। নোট করুন এটি পুরানো সংস্করণের সাথেও সামঞ্জস্যপূর্ণ, এওএসপি 10 নভেম্বর, 2011 এ প্রতিশ্রুতিবদ্ধ দেখুন AF9252849fd94c1f2859c56a4010900ea38a607e ইত্যাদি
উইকেন্ড

3

আপনি যদি ডেটা এবং ক্রিয়াকলাপটি ইনস্টল করা প্যাকেজটির প্রতিক্রিয়া জানেন তবে এটিকে শুরু করার আগে আপনার সাধারণ উদ্দেশ্যগুলিতে এই তথ্যগুলি যুক্ত করা উচিত।

আপনার যদি অন্য অ্যাপের অ্যান্ড্রয়েড ম্যানিফেস্টে অ্যাক্সেস থাকে তবে আপনি সেখানে প্রয়োজনীয় সমস্ত তথ্য দেখতে পারেন।


1
জবাবের জন্য ধন্যবাদ. হ্যাঁ আমার কাছে অন্য অ্যাপ্লিকেশনটির অ্যান্ড্রয়েড ম্যানিফেস্ট রয়েছে। আমি এখন যা করার চেষ্টা করছি তা হ'ল নিম্নলিখিত কোডটি: ইনটেন্ট ইন্টেন্ট = নতুন ইনটেন্ট (ইনটেন্ট Aএ্যাকশন_গ্রা); ইন্টেন্ট.সেট কম্পোনেন্ট (নতুন কম্পোনেন্টনাম ("com.package", "। মাইনএকটিভিটি")); startActivity (অভিপ্রায়); কিন্তু এইভাবে এটি কাজ করে না। আপনি কি আমাকে আরও সুনির্দিষ্ট লিঙ্ক দিতে পারেন, কীভাবে এটি করবেন?
বাসটিয়ান

1
অ্যাপ্লিকেশনটি "startActivity ..." লাইনে ক্র্যাশ হয়েছে: অ্যাপ্লিকেশনটি অপ্রত্যাশিতভাবে বন্ধ হয়ে গেছে। প্লিজ আবার চেষ্টা করুন। লগগেটে আমি কোথায় ত্রুটি দেখতে পাচ্ছি?
বাসটিয়ান

5
আমি ত্রুটিটি পেয়েছি: উপাদানটি নির্ধারণ করার সময়, কেবল শ্রেণীর পরিবর্তে সম্পূর্ণ যোগ্য শ্রেণীর নামকরণ করতে হবে: ইন্টেন্টের পরিবর্তে ইন্টেন্ট.সেট কম্পোনেন্ট (নতুন কম্পোনেন্টনাম ("com.package", "com.package.MainActivity"))) .setComp घटक (নতুন কম্পোনেন্টনাম ("com.package", "। প্রধান ক্রিয়াকলাপ"))
বাস্তিয়ান

1
জেনে রাখা ভাল ... আপনি গ্রহনটিতে লোগ্যাটিকে খুঁজে পেতে পারেন: উইন্ডো> প্রদর্শন দেখান> অন্যান্য, অ্যান্ড্রয়েড> লগক্যাট
ওয়ারেনফেইথ

@WarrenFaith আমি প্রয়োজন সঙ্গে সমর্থন stackoverflow.com/questions/52335402/... দয়া করে সহায়তা।
ব্যবহারকারী 158

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)

একটি সম্পর্কিত উত্তর এখানে


কীভাবে সি ++ তে লিখবেন প্লিজ।
জেনকোড

1
@GeneCode stackoverflow.com/a/22436147/8608146 সাহায্য করতে পারে আমি C ++ লিব মধ্যে অ্যান্ড্রয়েড আগে কখনো কাজ করে না।
ফানি ithত্বভিজ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.