android - প্রোগ্রামেটিকভাবে ডিফল্ট অ্যাপ্লিকেশন লঞ্চারটি কীভাবে সেট করবেন?




android-intent launcher (3)

আমি চাই যে যখন ডায়ালগটি আসে তখন ব্যবহারকারীকে কেবলমাত্র একবারের পরিবর্তে সর্বদা নির্বাচন করতে বাধ্য করা উচিত

অ্যান্ড্রয়েডে সুরক্ষার কিছু ত্রুটি বাদ দিয়ে সম্ভবত রুট ডিভাইসগুলি ছাড়া এটি সম্ভব নয়।

আমি যখন এটি করি তখন আমি আমার অ্যাপ্লিকেশন এবং স্টক লঞ্চারের মধ্যে পছন্দটি পাচ্ছি না

সঠিক। যদি কোনও ডিফল্ট ইতিমধ্যে চয়ন করা থাকে তবে এটি কেবলমাত্র ডিফল্টটি চালু করবে।

আমি স্টার্টঅ্যাক্টিভিটি ব্যবহার করার চেষ্টা করেছি (ইনটেন্ট। ক্রিয়েটচুজার (অভিপ্রায়, "দয়া করে সর্বদা লঞ্চের সেটিংস সেট করুন")); এবং আমি আমার অ্যাপ্লিকেশন এবং স্টক লঞ্চারের মধ্যে পছন্দগুলি পাই, তবে আমি সবসময় বা কেবলমাত্র বিকল্পগুলি পাই না।

সঠিক। createChooser() একটি পছন্দকে বাধ্য করে, তবে ডিফল্ট সেট করতে দেয় না।

আমি একটি লঞ্চার (কিওস্ক) অ্যাপ তৈরি করছি যা গুগলের মাধ্যমে ডাউনলোডযোগ্য হবে। এই অ্যাপ্লিকেশনটি প্রথম ইনস্টল করার সময় ব্যবহারকারীর মধ্যে কোন লঞ্চার (খনি বা স্টক) ডিফল্ট হবে তা চয়ন করার ক্ষমতা থাকবে has যদি ব্যবহারকারী আমার অ্যাপ্লিকেশনটিকে ডিফল্ট লঞ্চার না করে তবে আমি এটি নিজে হাতে আনার চেষ্টা করছি। আমি চাই যে ডায়ালগটি আসার পরে কেবলমাত্র একবারের পরিবর্তে ব্যবহারকারীকে সর্বদা নির্বাচন করতে বাধ্য করা হবে, অন্যথায়, ডায়ালগটি একটি বন্ধুত্বপূর্ণ বার্তার সাথে পর্যায়ক্রমে উপস্থিত হতে থাকবে। আমি এ পর্যন্ত চেষ্টা করেছি।

আমার অ্যাপ্লিকেশনটি ডিফল্ট কিনা তা পরীক্ষা করার জন্য আমি একটি পদ্ধতি তৈরি করেছি

/**
 * method checks to see if app is currently set as default launcher
 * @return boolean true means currently set as default, otherwise false
 */ 
private boolean isMyAppLauncherDefault() {
    final IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
    filter.addCategory(Intent.CATEGORY_HOME);

    List<IntentFilter> filters = new ArrayList<IntentFilter>();
    filters.add(filter);

    final String myPackageName = getPackageName();
    List<ComponentName> activities = new ArrayList<ComponentName>();
    final PackageManager packageManager = (PackageManager) getPackageManager();

    packageManager.getPreferredActivities(filters, activities, null);

    for (ComponentName activity : activities) {
        if (myPackageName.equals(activity.getPackageName())) {
            return true;
        }
    }
    return false;
}   

তারপরে আমি চয়নকারীটি চালু করার চেষ্টা করি

/**
 * method starts an intent that will bring up a prompt for the user
 * to select their default launcher. It comes up each time it is
 * detected that our app is not the default launcher
 */
private void launchAppChooser() {
    Log.d(TAG, "launchAppChooser()");
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

আমি যখন এটি করি তখন আমি আমার অ্যাপ্লিকেশন এবং স্টক লঞ্চারের মধ্যে পছন্দটি পাচ্ছি না। আমি startActivity(Intent.createChooser(intent, "Please set launcher settings to ALWAYS")); ব্যবহার করার চেষ্টা startActivity(Intent.createChooser(intent, "Please set launcher settings to ALWAYS")); এবং আমি আমার অ্যাপ্লিকেশন এবং স্টক লঞ্চারের মধ্যে পছন্দগুলি পাই, তবে আমি সবসময় বা কেবলমাত্র বিকল্পগুলি পাই না।

আমি চয়নকারী আরম্ভ করার পরিবর্তে এর জন্য একটি কাস্টম ডায়ালগ তৈরি করতে পারি তবে ডিফল্ট অ্যাপ্লিকেশন লঞ্চারটি প্রোগ্রামিয়ালি সেট করতে কীভাবে আমাকে জানতে হবে। আগাম ধন্যবাদ!


এটি সামান্য পরিশ্রমের মাধ্যমে বাস্তবে সম্ভব:

একটি ফাঁকা Activity তৈরি করুন যা FakeLauncherActivity নামে একটি FakeLauncherActivity হিসাবে কাজ করে। অক্ষম উপাদান হিসাবে এটি আপনার ম্যানিফেস্টে যুক্ত করুন:

<activity
    android:name="com.path.to.your.FakeLauncherActivity"
    android:enabled="false">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

আপনার পছন্দসই লঞ্চার ক্রিয়াকলাপটি ডিফল্টরূপে isMyAppLauncherDefault() আপনার প্রশ্ন থেকে isMyAppLauncherDefault() কিনা তা পরীক্ষা করে দেখুন।

যদি তা না হয় তবে ব্যবহারকারীদের পছন্দসই লঞ্চার ক্রিয়াকলাপটি বেছে নেওয়ার প্রস্তাব করুন:

public static void resetPreferredLauncherAndOpenChooser(Context context) {
    PackageManager packageManager = context.getPackageManager();
    ComponentName componentName = new ComponentName(context, com.path.to.your.FakeLauncherActivity.class);
    packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

    Intent selector = new Intent(Intent.ACTION_MAIN);
    selector.addCategory(Intent.CATEGORY_HOME);
    selector.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(selector);

    packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP);
}

এই পদ্ধতিটি অস্থায়ীভাবে FakeLauncherActivity সক্ষম FakeLauncherActivity , যা উপলব্ধ লঞ্চার ক্রিয়াকলাপগুলির সেটকে পরিবর্তনের দিকে পরিচালিত করে, যা অ্যান্ড্রয়েডকে তার ডিফল্ট লঞ্চারটি ভুলে যেতে বাধ্য করে। আপনি কিছু দেখতে পাবেন ...

521-735/system_process I/PackageManager Result set changed, dropping preferred activity for Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 } type null

... তোমার লগে

এরপরে পদ্ধতিটি সহজেই একটি লঞ্চারের উদ্দেশ্যটি খোলে যেখানে আপনি সমস্ত ইনস্টল করা লঞ্চার এবং বোতামগুলি "সর্বদা" / "কেবল একবার" দেখতে পাবেন। অবশেষে, পদ্ধতিটি আবার FakeLauncherActivity অক্ষম করে যাতে তালিকায় এটি প্রদর্শিত না হয়।

আপনি যতবার চান তার পুনরাবৃত্তি করতে পারেন এবং আপনার পছন্দসই লঞ্চার ক্রিয়াকলাপটি ডিফল্ট হিসাবে সেট করা থাকলে ব্যবহারকারীকে কেবল এগিয়ে যেতে দিন।


যদি আপনি গুগল ইএমএম সমাধান (উত্সর্গীকৃত ডিভাইস) প্রয়োগ করে থাকেন:

https://developer.android.com/work/dpc/dedicated-devices/cookbook

// Create an intent filter to specify the Home category.
IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
filter.addCategory(Intent.CATEGORY_DEFAULT);

// Set the activity as the preferred option for the device.
ComponentName activity = new ComponentName(context, KioskModeActivity.class);
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
dpm.addPersistentPreferredActivity(adminName, filter, activity);






launcher