سؤال

للحصول على بعض المتطلبات المحددة ، يُطلب مني تغيير تطبيق Android الافتراضي المنزلي من خلال تطبيق منزلي المخصص (إعداد داخل تطبيقي الذي سيقوم بتبديل المنزل الافتراضي = طلبي أو منزلي السابق)

لا أريد للمستخدم أن يسافر إعدادات Android معقدة للغاية.

هل يمكن لأي شخص أن يساعدني مثل المكان الذي يسجل فيه Launcher.Apk للتطبيق الافتراضي للمنزل أو كيفية تغيير ذلك

الشيء الوحيد الذي يمكن أن أجده هو هذا السؤال القديم: كيفية تغيير تطبيق سطح المكتب الخاص بـ Android؟

لكن لا توجد إجابات على الإطلاق.

لقد رأيت Homeswitcher في السوق يقوم بالخدعة ، لكن لا توجد إجابة للمطور قد تكون مشغولة بالتأكيد.

تعديل

لقد وجدت هذا على شبكة الإنترنت http://www.mail-archive.com/android-developers@googlegroups.com/msg74167.html

لكنني حصلت على نفس المشكلة:

هذا هو الكود الخاص بي:

    private void makePreferred() {
            PackageManager pm = getPackageManager();
            IntentFilter f = new IntentFilter("android.intent.action.MAIN");
            f.addCategory("android.intent.category.HOME");
            f.addCategory("android.intent.category.DEFAULT");
            ComponentName cn = new ComponentName("com.example.android.home", "com.example.android.home.Home");
            pm.addPreferredActivity(f, IntentFilter.MATCH_CATEGORY_EMPTY, null, cn);

لدي android.permission.SET_PREFERRED_APPLICATIONS تعيين في البيان. بعد تنفيذ الكود أعلاه ، تمت إضافة سجلات السجلات كما هو متوقع (نفس السجلات كما هو الحال عند وضع علامة "جعل الافتراض" من قائمة IntentResolver). ومع ذلك ، عندما أتابع بالنقر على المنزل ، لا تزال القائمة تظهر وتقول السجلات:

INFO/PackageManager(52): Result set changed, dropping preferred
activity for Intent { act=android.intent.action.MAIN cat=
[android.intent.category.HOME] flg=0x10200000 } type null

لذلك يبدو أن المحدد يحذف الإدخال الافتراضي. هل أفعل شيئًا خاطئًا ، أم أن هذا مقياس أمني؟ ما هي الأفكار وراء هذا؟

هل كانت مفيدة؟

المحلول

لقد أجريت بحثًا مكثفًا حول ذلك وبدء من 2.2 لا توجد طريقة للقيام بذلك. الطريقة الوحيدة هي استخدام بعض القرصنة التي يقوم بها تطبيق Lock Toddler ، لكن هذا التطبيق يضع هواتف Samsung مؤخرًا في حلقة Infinite ، لذلك فهو نهج محفوف بالمخاطر.

إذا نظرت إلى رمز مصدر Froyo هنا من فئة Packagemanager ، سترى هذه الحالة الصغيرة في طريقة AddPreferRextivity:

if (getUidTargetSdkVersionLockedLP(Binder.getCallingUid())
                     < Build.VERSION_CODES.FROYO) {
                 Slog.w(TAG, "Ignoring addPreferredActivity() from uid"
                        + Binder.getCallingUid());
                 return;
             }

لا يعمل HomesWitcher بشكل صحيح على 2.2 لأنه يستخدم هذه الطريقة بالذات وقدم المطور تعليقًا على صفحة التطبيق "Froyo (2.2) غير مدعوم بسبب تغيير API"

نصائح أخرى

"تم تغيير مجموعة النتائج" تعني أن مجموعة الحزم التي تتطابق مع هذه النية قد تغيرت من المجموعة التي حددتها عند إنشاء الافتراضي - - وبالتالي لم يعد الافتراضي صالحًا. تحتاج قائمة المكونات الخاصة بك (التي تقوم بتعيينها حاليًا إلى NULL) إلى احتواء جميع تطبيقات الشاشة الرئيسية الموجودة على الجهاز ، وليس فقط لك.

فيما يلي رمز المثال الذي اختبرته (باستخدام adb shell am start http://www.google.co.uk/ ) واستخدمت لتعيين المتصفح الافتراضي. يمثل xxx اسم العميل الذي اضطررت إلى الخروج.

لاحظ أنه من أجل استدعاء AddPreferRedActivity ، يجب أن تكون قد تم تجميعها مقابل إصدار الحد الأدنى من SDK من 8 (2.2) ويجب أن تكون قد حددت إذن set_preferred_applications. هذا الإذن هو مستوى الحماية 2 ، لذلك يجب توقيعك مع نفس شهادة Packagemanager.

IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.VIEW");
filter.addCategory("android.intent.category.DEFAULT");
filter.addDataScheme("http");
Context context = getApplicationContext();
ComponentName component = new ComponentName("com.opera.mini.XXX", "com.opera.mini.XXX.CustomerBrowser");
ComponentName[] components = new ComponentName[] {new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"),
                                                  component};
pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_SCHEME, components, component);

ETA - إذا قمت بتمييز هذا الرد لأسفل ، فهل يمكن أن تخبرني بالسبب. الكود الذي نشرته أعلاه يتم اختباره والعمل ...

startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));

يعمل هذا الرمز على جهاز ICS الخاص بي: أستخدم خدمة معقولة لبعض المكالمات ، ويسمى أحدها SET_PREFRED_LAUNCHER ، وضع حزمة القاذفة الافتراضية الجديدة (PRIEFTRED_PACKAGE_KEY) ونشاطها (PRIEFRED_ACTIVITY_KEY)

Method installPackageMethod = null;
Method deletePackageMethod = null;
Method setPreferredActivityMethod = null;
Method replacePreferredActivityMethod = null;
Object pm = null;


    @Override
public void onCreate() {
    super.onCreate();
        if (pm == null)
        pm = getPackageManager();
    try {
        if (setPreferredActivityMethod == null)
            setPreferredActivityMethod = pm.getClass().getMethod(
                    "addPreferredActivity", IntentFilter.class, int.class,
                    ComponentName[].class, ComponentName.class);
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
}


private final class ServiceHandler extends Handler {
    private Context context;

    public ServiceHandler(Looper looper, Context ctx) {
        super(looper);
        context = ctx;
    }

    @Override
    public void handleMessage(Message msg) {
        Intent intent = (Intent) msg.getData().getParcelable(
                UPDATER_SERVICE_ACTION);
        int request = intent.getIntExtra(
                REQUEST_KEY,
                REQUEST_UNKNOWN);
        Bundle bundle = intent.getExtras();

        switch (request) {
        case INSTALL_APPLICATION: {
            if (bundle != null) {
                String appPath = bundle
                        .getString(APP_PATH_KEY);
                if (appPath != null) {
                    LogUtil.e(TAG, "try to install " + appPath);

                    try {
                        am.installPackage(appPath);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    LogUtil.e(TAG, "install of " + appPath + " done");
                }
            }
            break;
        }
        case UNISTALL_PACKAGE: {
            if (bundle != null) {
                String packagename = bundle
                        .getString(PACKAGE_NAME_KEY);
                if (packagename != null) {
                    LogUtil.e(TAG, "unistall " + packagename);

                    try {
                        deletePackageMethod
                                .invoke(pm, packagename, null, 0);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            break;
        }
        case SET_PREFERRED_LAUNCHER: {
            if (bundle != null) {
                String package_name = bundle
                        .getString(PREFERRED_PACKAGE_KEY);
                if (package_name == null) {
                    LogUtil.e(TAG,
                            "WARNING: setDefaultActivity cannot continue, package is NULL");
                    return;
                }
                String activity_name = bundle
                        .getString(PREFERRED_ACTIVITY_KEY);
                if (activity_name == null) {
                    LogUtil.e(TAG,
                            "WARNING: setDefaultActivity cannot continue, activity is NULL");
                    return;
                }

                LogUtil.e(TAG, "setDefaultActivity activity="
                        + activity_name + " package=" + package_name);

                IntentFilter filter = new IntentFilter(
                        "android.intent.action.MAIN");
                filter.addCategory("android.intent.category.HOME");
                filter.addCategory("android.intent.category.DEFAULT");
                ComponentName[] components = new ComponentName[] {
                        new ComponentName("com.android.launcher",
                                "com.android.launcher2.Launcher"),
                        new ComponentName(package_name, activity_name) };
                ComponentName activity = new ComponentName(package_name,
                        activity_name);
                try {
                    setPreferredActivityMethod.invoke(pm, filter,
                            IntentFilter.MATCH_CATEGORY_EMPTY, components,
                            activity);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        }

    }

}

تذكر أن تضيف ملفك البياني هذا الإذن:

    <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/>

الاستخدام:

    public void setPreferredLauncher(String activity_name,String package_name)
{
    Intent intent = new Intent(UPDATER_SERVICE_ACTION);
    intent.putExtra(REQUEST_KEY, SET_PREFERRED_LAUNCHER);
    intent.putExtra(PREFERRED_ACTIVITY_KEY, activity_name);
    intent.putExtra(PREFERRED_PACKAGE_KEY, package_name);
    context.startService(intent);
}

أين:

    public static final String _UPDATER_SERVICE_ACTION = "com.android.updaterservice.ACTION";
public static final String REQUEST_KEY = "com.android.updaterservice.REQUEST_KEY";
public static final String PACKAGE_NAME_KEY = "com.android.updaterservice.PACKAGE_NAME_KEY";
public static final String APP_PATH_KEY = "com.android.updaterservice.APP_PATH_KEY";
public static final String PREFERRED_ACTIVITY_KEY = "com.android.updaterservice.PREFERRED_ACTIVITY_KEY";
public static final String PREFERRED_PACKAGE_KEY = "com.android.updaterservice.PREFERRED_PACKAGE_KEY";
public static final String INSTALL_PACKAGE_RESULT = "com.android.updaterservice.INSTALL_PACKAGE_RESULT";
public static final String PACKAGE_NAME = "PACKAGE_NAME";
public static final String INSTALL_SUCCEEDED = "INSTALL_SUCCEEDED";
public static final int REQUEST_UNKNOWN = -1;
public static final int INSTALL_APPLICATION = 1;
public static final int UNISTALL_PACKAGE = 2;
public static final int SET_PREFERRED_LAUNCHER = 3;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top