অ্যাপ্লিকেশন ইনস্টল রয়েছে কিনা তা দেখুন - অ্যান্ড্রয়েড


105

আমি গুগল প্লে থেকে অ্যাপস ইনস্টল করার চেষ্টা করছি। আমি বুঝতে পারি যে গুগল প্লে স্টোরের ইউআরএল খোলার পরে এটি গুগল প্লেটি খুলবে এবং আমি যখন পিছনের বোতামটি টিপব তখন কার্যকলাপ আবার শুরু হয়।

Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(appURL));
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(marketIntent);

যখন আমি ক্রিয়াকলাপে ফিরে যাই onResume(), অ্যাপটি ইনস্টল করা হয়েছে কিনা তা পরীক্ষা করার জন্য আমি এটিকে কল করার চেষ্টা করেছি , তবে আমি একটি ত্রুটি পেয়েছি:

@Override
protected void onResume() {
    super.onResume();
    boolean installed = false;
    while (!installed) {
        installed  =   appInstalledOrNot(APPPACKAGE);
        if (installed) {
             Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show();
        }
    }
}

private boolean appInstalledOrNot(String uri) {
  PackageManager pm = getPackageManager();
  boolean app_installed = false;
  try {
      pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
      app_installed = true;
  }
  catch (PackageManager.NameNotFoundException e) {
      app_installed = false;
  }
  return app_installed ;
}

ত্রুটিটি নিম্নরূপ:

ই / অ্যান্ড্রয়েডআরটাইম (6৯6): জাভা.এল.আরুনটাইম এক্সেপশন: ক্রিয়াকলাপটি শুরু করতে অক্ষম I .আইন্টেন্ট.অ্যাকশন.উইউভিউ ডেটা = মার্কেট: // বিশদ? আইডি = কম.প্যাকেজ.নাম ফ্লাগ = 0x40080000}

আমি অনুমান করছি কার্যকলাপটি onPause()। এটি বাস্তবায়নের জন্য আরও ভাল উপায় আছে কি? অ্যাপটি ইনস্টল করা শেষ হয়েছে কিনা তা আমি খতিয়ে দেখার চেষ্টা করছি।



@ সিদ্ধার্থন আসকান যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনি এখানে যা অর্জন করতে চাইছেন তা হ'ল, আপনার অ্যাপ্লিকেশনটি শুরু করুন -> স্টোর খেলতে যান -> ইনস্টল ক্লিক করুন -> আপনার নিজের ক্রিয়াকলাপে ফিরে আসুন -> নতুন ইনস্টলড অ্যাপ্লিকেশনটি শুরু করুন .. এটি কি ঠিক?
বরুণ

আমি প্রথমে যে অ্যাপটি খুললাম তাতে ফিরে যান না। প্যাকেজম্যানেজারটি ব্যবহার করে ইনস্টল করা অ্যাপটি সম্পর্কে আমার কিছু তথ্য নেওয়া দরকার। ওয়েব ইউআরএল খোলার ফলে আমি প্রাথমিক থেকে অ্যাপটি ইনস্টল করার পরে এই তথ্য পুনরুদ্ধার শুরু হবে।
সিদ্ধার্থন আসকান

উত্তর:


306

এটা চেষ্টা কর:

private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

এটি আপনি যে প্যাকেজটির নাম দিয়ে গেছেন সে সম্পর্কে তথ্য আনার চেষ্টা করে that এটি ব্যর্থ হলে, যদি কোনওটি NameNotFoundExceptionনিক্ষেপ করা হয় তবে এর অর্থ হ'ল সেই নামের কোনও প্যাকেজ ইনস্টল করা নেই, তাই আমরা ফিরে আসি false

নোট করুন যে আমরা একটিটির PackageManagerপরিবর্তে পাস করেছি Context, যাতে পদ্ধতিটি আরও নমনীয়ভাবে ব্যবহারযোগ্য হয় এবং ডেমিটারের আইন লঙ্ঘন করে না । কোনও Contextউদাহরণ অ্যাক্সেস ছাড়াই আপনি এই পদ্ধতিটি ব্যবহার করতে পারবেন , যতক্ষণ আপনার কোনও PackageManagerউদাহরণ থাকে।

এটি এর মতো ব্যবহার করুন:

public void someMethod() {
    // ...

    PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);

    // ...
}

4
শর্তটি হ'ল: এই ইনস্টলেশন প্রক্রিয়াটি সম্পন্ন হলে আমার চেক করা দরকার। আমি ইনস্টল ক্লিক করি এবং এই সময়ে আমি একটি লুপে ইনস্টলেশন পরীক্ষা করার চেষ্টা করি। কোডটি ঠিক আছে তবে ইনস্টলেশনটি সম্পূর্ণ হয়েছে কিনা তা যাচাই করার পদ্ধতিটি আমি যা খুঁজছি।
সিদ্ধার্থন আসকান

4
@ সিদ্ধার্থআসকান আপনি প্যাকেজ_ডেড ক্রিয়াকলাপের জন্য একটি সম্প্রচার রিসিভার ব্যবহার করতে পারেন।
বরুণ

@ ভারুন আমি সবেমাত্র কোডটি সম্পাদনা করেছি। এটি আর কোনও অ্যাপ প্যাকেজের নাম ব্যবহার করছে না using গুগল প্লে
স্টোরটিতে

@ রবিন ক্যান্টারস দয়া করে আমি যে পরিবর্তনগুলি করেছি তা পর্যালোচনা করুন
সিদ্ধার্থ

আপনি আপনার প্রশ্নে যা করেছেন তা আমার উত্তর হিসাবে একই।
রবিন ক্যান্টারস

35

রবিন ক্যান্টারের উত্তর সঠিক, তবে এটি সক্ষম বা অক্ষম রাষ্ট্র নির্বিশেষে ইনস্টলড অ্যাপ্লিকেশনগুলির জন্য এটি পরীক্ষা করে।

আমরা সবাই জানি যে একটি অ্যাপ্লিকেশন ইনস্টল করা যেতে পারে তবে ব্যবহারকারীর দ্বারা অক্ষম করা যায়, তাই অযোগ্য।

ইনস্টলড এবং সক্ষম অ্যাপ্লিকেশনগুলির জন্য এটি পরীক্ষা করে:

public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        return packageManager.getApplicationInfo(packageName, 0).enabled;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

আপনি এই পদ্ধতিটি পছন্দ মতো ক্লাসে রাখতে পারেন Utilsএবং এটি ব্যবহার করে যেকোন জায়গায় কল করতে পারেন :

boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())

7

দ্রুত সমাধান:

private boolean isPackageInstalled(String packagename, PackageManager packageManager) {
    try {
        packageManager.getPackageGids(packagename);
        return true;
    } catch (NameNotFoundException e) {
        return false;
    }
}

getPackageGidsথেকে কম ব্যয়বহুল getPackageInfo, তাই এটি দ্রুত কাজ করে।

Run 10000 on API 15
Exists pkg:
getPackageInfo: nanoTime = 930000000
getPackageGids: nanoTime = 350000000
Not exists pkg:
getPackageInfo: nanoTime = 420000000
getPackageGids: nanoTime = 380000000

Run 10000 on API 17
Exists pkg:
getPackageInfo: nanoTime = 2942745517
getPackageGids: nanoTime = 2443716170
Not exists pkg:
getPackageInfo: nanoTime = 2467565849
getPackageGids: nanoTime = 2479833890

Run 10000 on API 22
Exists pkg:
getPackageInfo: nanoTime = 4596551615
getPackageGids: nanoTime = 1864970154
Not exists pkg:
getPackageInfo: nanoTime = 3830033616
getPackageGids: nanoTime = 3789230769

Run 10000 on API 25
Exists pkg:
getPackageInfo: nanoTime = 3436647394
getPackageGids: nanoTime = 2876970397
Not exists pkg:
getPackageInfo: nanoTime = 3252946114
getPackageGids: nanoTime = 3117544269

দ্রষ্টব্য: এটি কিছু ভার্চুয়াল স্পেসে কাজ করবে না। Package প্যাকেজটির নামের সাথে কোনও অ্যাপ্লিকেশন না থাকলেও তারা অ্যান্ড্রয়েড API লঙ্ঘন করতে পারে এবং সর্বদা একটি অ্যারে ফিরিয়ে দিতে পারে।
এই ক্ষেত্রে, ব্যবহার করুন getPackageInfo


5

এটা চেষ্টা কর:

public static boolean isAvailable(Context ctx, Intent intent) {
    final PackageManager mgr = ctx.getPackageManager();
    List<ResolveInfo> list =
        mgr.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

1

অ্যান্ড্রয়েড 11 (এপিআই স্তর 30), যেহেতু বেশিরভাগ ব্যবহারকারী-ইনস্টল থাকা অ্যাপ্লিকেশনগুলি ডিফল্টরূপে দৃশ্যমান হয় না। আপনার ম্যানিফেস্টে, আপনাকে অবশ্যই নীচের মতো কোনও অ্যাপ্লিকেশন সম্পর্কে তথ্য পেতে যাচ্ছেন তা স্থিরভাবে ঘোষণা করতে হবে:

<manifest>
    <queries>
        <!-- Explicit apps you know in advance about: -->
        <package android:name="com.example.this.app"/>
        <package android:name="com.example.this.other.app"/>
    </queries>
    
    ...
</manifest>

তারপরে, @ রবিনক্যান্টরস এর উত্তর কাজ করে:

private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

// ...
// This will return true on Android 11 if the app is installed,
// since we declared it above in the manifest.
isPackageInstalled("com.example.this.app", pm); 
// This will return false on Android 11 even if the app is installed:
isPackageInstalled("another.random.app", pm); 

এখানে আরও জানুন:


0

আপনি যদি ক্যাচ ব্লক ব্যতীত চেষ্টা করে দেখতে চান তবে নীচের পদ্ধতিটি ব্যবহার করতে পারেন, একটি অভিপ্রায় তৈরি করুন এবং অ্যাপ্লিকেশনটির প্যাকেজ সেট করুন যা আপনি যাচাই করতে চান

val intent = Intent(Intent.ACTION_VIEW)
intent.data = uri
intent.setPackage("com.example.packageofapp")

এবং অ্যাপটি ইনস্টল করা আছে কিনা তা পরীক্ষা করতে নিম্নলিখিত পদ্ধতিতে কল করুন

fun isInstalled(intent:Intent) :Boolean{
    val list = context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return list.isNotEmpty()
}

0

যারা কোটলিন সমাধানের সন্ধান করছেন তারা এই পদ্ধতিটি ব্যবহার করতে পারেন,

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

fun isAppInstalled(packageName: String, context: Context): Boolean {
        return try {
            val packageManager = context.packageManager
            packageManager.getPackageInfo(packageName, 0)
            true
        } catch (e: PackageManager.NameNotFoundException) {
            false
        }
    }

0

আপনি এটি কোটলিনে ব্যবহার করতে পারেন extentions.kt

fun Context.isPackageInstalled(packageName: String): Boolean {
    return try {
        packageManager.getPackageInfo(packageName, 0)
        true
    } catch (e: PackageManager.NameNotFoundException) {
        false
    }
}

ব্যবহার

context.isPackageInstalled("com.somepackage.name")

-1
    private boolean isAppExist() {

    PackageManager pm = getPackageManager();
    try {
        PackageInfo info = pm.getPackageInfo("com.facebook.katana", PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    return true;
}




if (isFacebookExist()) {showToast(" Facebook is  install.");}
     else {showToast(" Facebook is not install.");}

এটি গৃহীত উত্তরের
মতোই

-1
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

// প্যাকেজ ইনস্টল করার জন্য সত্য / মিথ্যা পরীক্ষা করার পদ্ধতি

  public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    boolean found = true;
    try {
      packageManager.getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
      found = false;
    }

    return found;
  }

এটি স্বীকৃত উত্তরের
মতোই

-9
@Override 
protected void onResume() {
    super.onResume();
    boolean installed = false;

    while (!installed) {
        installed = appInstalledOrNot (APPPACKAGE);
        if (installed) {
            Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show ();
        }
    }
} 

private boolean appInstalledOrNot (String uri) {
    PackageManager pm = getPackageManager();
    boolean app_installed = false;
    try {
        pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
        app_installed = true;
    } catch (PackageManager.NameNotFoundException e) {
        app_installed = false;
    }
    return app_installed;
}

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