2012-10-31 14 views
22

नोवा दुनिया को कैसे प्रबंधित करता है? मैं सचमुच एक ही चीज़ करने की कोशिश कर रहा हूं: अपने नए डिफ़ॉल्ट लॉन्चर को साफ़ करने और चुनने के लिए उपयोगकर्ताओं को एक बटन प्रदान करें।डिफ़ॉल्ट होम एप्लिकेशन को साफ़ करना और सेट करना

मैं डिफ़ॉल्ट ऐप्लिकेशन का नाम हो और यह प्रदर्शित करने में सक्षम हूँ:

 private String getPrefered(Intent i) { 
     PackageManager pm = this.getActivity().getPackageManager(); 
     final ResolveInfo mInfo = pm.resolveActivity(i, 0); 
     return (String) pm.getApplicationLabel(mInfo.activityInfo.applicationInfo); 
    } 

जहां Intent i

Intent home = new Intent("android.intent.action.MAIN"); 
     home.addCategory("android.intent.category.HOME"); 

तब मैं प्रणाली ResolveActivity फोन है,

private void makePrefered() { 
     Intent selector = new Intent("android.intent.action.MAIN"); 
     selector.addCategory("android.intent.category.HOME");       
     selector.setComponent(new ComponentName("android", "com.android.internal.app.ResolverActivity")); 
     startActivity(selector); 
    } 

पिकर आता है और सही तरीके से काम करता है, लेकिन यह वास्तव में किसी भी वी को सेट या साफ़ नहीं करता है alues। इसे डिबग करने के दौरान, ऐसा लगता है जैसे मुझे कुछ अतिरिक्त याद आ रही है? जब मैं makePrefered विधि कॉल, मैं निम्नलिखित लॉग संदेश मिलता है,

I/ActivityManager( 602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] cmp=android/com.android.internal.app.ResolverActivity u=0} from pid 22641 

जब मैं नोवा कार्यान्वयन का उपयोग मैं यह सब लेकिन देखते हैं,

I/PackageManager( 602): Result set changed, dropping preferred activity for Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 (has extras) } type null 
I/ActivityManager( 602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=android/com.android.internal.app.ResolverActivity (has extras) u=0} from pid 22905 
I/ActivityManager( 602): START {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.mycolorscreen.canvas/.Launcher (has extras) u=0} from pid 22905 
  1. मैं वहाँ में कैसे प्राप्त कर सकते हैं और देखें कि उस बंडल के साथ क्या भेजा जा रहा है?
  2. मैं पसंदीदा ऐप को कैसे साफ़ कर सकता हूं? मुझे मत बताओ कि आप नहीं कर सकते, मैंने उन उत्तरों में से पर्याप्त देखा है। नोवा यह करता है और यह वैसे ही करता है जिस तरह से मैं चाहता हूं।

उत्तर

44

ऐसा करने के लिए कोड वास्तव में बस एक बहुत चालाक काम है।

जब

 <category android:name="android.intent.category.HOME" /> 

के साथ एक घटक सक्षम किया गया है, एक एक नया घर आवेदन के स्थापित आम तौर पर से, डिफ़ॉल्ट घर एप्लिकेशन को मंजूरी दे दी हो जाता है।

इस तरह के घरेलू घटक के साथ एक खाली गतिविधि बनाकर इसका लाभ उठाने के लिए।

<activity 
      android:name="com.t3hh4xx0r.haxlauncher.FakeHome" 
      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>  

आप अपने नए डिफ़ॉल्ट सेट करना चाहते हैं, तो आप इस घटक सक्षम करें, फिर घर के इरादे फोन और फिर अपने नकली घर घटक फिर से अक्षम करें।

public static void makePrefered(Context c) { 
     PackageManager p = c.getPackageManager(); 
     ComponentName cN = new ComponentName(c, FakeHome.class); 
     p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); 

     Intent selector = new Intent(Intent.ACTION_MAIN); 
     selector.addCategory(Intent.CATEGORY_HOME);    
     c.startActivity(selector); 

     p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 
    } 

अंतिम परिणाम प्रणाली को लगता है कि एक नया घर एप्लिकेशन स्थापित किया गया था, ताकि डिफ़ॉल्ट आप किसी विशेष अनुमति की साथ तुम्हारा सेट करने के लिए अनुमति को मंजूरी दे दी है।

यह कैसे किया जाता है इस बारे में जानकारी के लिए टेस्लाकोइल और नोवालाउचर से केविन के लिए धन्यवाद!

+0

मैंने 4.2.2 पर यह कोशिश की है और यह काम नहीं करता है ... केवल एक नया होम लॉन्चर स्थापित करते समय व्यवहार जैसा वर्णन किया गया है। – TacB0sS

+0

डुनो। हैवेन्ट ने थोड़ी देर में यह कोशिश की। – r2DoesInc

+1

मैंने अपने नेक्सस 4 के साथ 4.2.2 पर कोशिश की, और यह काम करता है। –

3

r2DoesInc का समाधान मेरे 4.2.2 परीक्षण डिवाइस पर काम नहीं करता है।
मेरे समाधान: तो मेरे ऐप की HomeActivity पुन: सक्षम अक्षम करें, यह FakeHome

PackageManager p = getPackageManager(); 
ComponentName cN = new ComponentName(this, HomeActivity.class); 
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 
startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)); 
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); 
2

मैं एक पर Android 4.1.2 पर निम्नलिखित कोड का उपयोग एक मंच-हस्ताक्षरित कियोस्क मोड आवेदन के साथ बनाने के लिए नहीं है औद्योगिक टैबलेटयह बहिष्कृत PackageManager.addPreferredActivity() का उपयोग करता है, लेकिन इसका फायदा यह है कि यह उपयोगकर्ता के संपर्क के बिना काम करता है। मानक एंड्रॉइड लॉन्चर को "हमेशा" विकल्प के साथ चुना गया है, यह भी काम करता है।

// Requires permission SET_PREFERRED_APPLICATIONS. 
public static boolean setPreferredHomeActivity (Context context, String packageName, String className) { 
    ComponentName oldPreferredActivity = getPreferredHomeActivity(context); 
    if (oldPreferredActivity != null && packageName.equals(oldPreferredActivity.getPackageName()) && className.equals(oldPreferredActivity.getClassName())) { 
     return false; } 
    if (oldPreferredActivity != null) { 
     context.getPackageManager().clearPackagePreferredActivities(oldPreferredActivity.getPackageName()); } 
    IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN); 
    filter.addCategory(Intent.CATEGORY_HOME); 
    filter.addCategory(Intent.CATEGORY_DEFAULT); 
    ComponentName[] currentHomeActivities = getActivitiesListByActionAndCategory(context, Intent.ACTION_MAIN, Intent.CATEGORY_HOME); 
    ComponentName newPreferredActivity = new ComponentName(packageName, className); 
    context.getPackageManager().addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, currentHomeActivities, newPreferredActivity); 
    return true; } 

private static ComponentName getPreferredHomeActivity (Context context) { 
    ArrayList<IntentFilter> filters = new ArrayList<>(); 
    List<ComponentName> componentNames = new ArrayList<>(); 
    context.getPackageManager().getPreferredActivities(filters, componentNames, null); 
    for (int i = 0; i < filters.size(); i++) { 
     IntentFilter filter = filters.get(i); 
     if (filter.hasAction(Intent.ACTION_MAIN) && filter.hasCategory(Intent.CATEGORY_HOME)) { 
     return componentNames.get(i); }} 
    return null; } 

private static ComponentName[] getActivitiesListByActionAndCategory (Context context, String action, String category) { 
    Intent queryIntent = new Intent(action); 
    queryIntent.addCategory(category); 
    List<ResolveInfo> resInfos = context.getPackageManager().queryIntentActivities(queryIntent, PackageManager.MATCH_DEFAULT_ONLY); 
    ComponentName[] componentNames = new ComponentName[resInfos.size()]; 
    for (int i = 0; i < resInfos.size(); i++) { 
     ActivityInfo activityInfo = resInfos.get(i).activityInfo; 
     componentNames[i] = new ComponentName(activityInfo.packageName, activityInfo.name); } 
    return componentNames; } 
+0

4.1.2 पर अनुमति के लिए आप एंड्रॉइड.permission.SET_PREFERRED_APPLICATIONS के लिए अनुरोध कैसे किया ?? मुझे लगता है कि इसे बहिष्कृत किया गया है "यह निरंतर एपीआई स्तर 7 में बहिष्कृत किया गया था"। – umesh

+0

@umesh मैंने अभी प्रकट फ़ाइल में SET_PREFERRED_APPLICATIONS जोड़ा है। इसे बहिष्कृत किया गया है, लेकिन यह एपीआई स्तर 16 (एंड्रॉइड 4.1.2) के साथ काम करता है। –

संबंधित मुद्दे