2012-10-31 39 views
22

Nova quản lý điều này như thế nào? Tôi đang cố gắng thực hiện chính xác điều tương tự: cung cấp cho người dùng một nút nhấn để xóa và chọn trình khởi chạy mặc định mới của họ.Xóa và cài đặt ứng dụng mặc định tại nhà

Tôi có thể lấy tên ứng dụng mặc định và hiển thị nó:

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

nơi Intent i

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

Sau đó, tôi gọi lên ResolveActivity hệ thống,

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

Bộ chọn đi lên và hoạt động chính xác, nhưng nó không thực sự thiết lập hoặc xóa bất kỳ v alues. Trong khi gỡ lỗi nó, có vẻ như tôi đang thiếu một số tính năng bổ sung? Khi tôi gọi phương thức makePrefered, tôi nhận được thông tin đăng nhập sau,

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 

Khi tôi sử dụng thực hiện Nova tôi thấy tất cả những điều này tuy nhiên,

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. Làm thế nào tôi có thể nhận được ở đó và xem những gì đang được gửi cùng với gói đó?
  2. Tôi làm cách nào để xóa ứng dụng ưu tiên? Đừng nói với tôi rằng bạn không thể, tôi đã thấy đủ những câu trả lời đó. Nova làm điều đó và thực hiện chính xác cách tôi muốn.

Trả lời

44

Mã để làm điều này thực sự chỉ là một công việc rất thông minh.

Khi một thành phần với

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

được kích hoạt, thường từ một cài đặt của một ứng dụng ngôi nhà mới, ứng dụng chủ mặc định bị xóa.

Để tận dụng điều này bằng cách tạo hoạt động trống với thành phần nhà như thế này.

<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>  

Khi bạn muốn thiết lập mặc định mới của bạn, bạn kích hoạt phần này, sau đó gọi mục đích nhà và sau đó vô hiệu hóa phần nhà giả của mình một lần nữa.

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

Kết quả cuối cùng là hệ thống cho rằng bạn đã cài đặt ứng dụng mới, vì vậy mặc định sẽ bị xóa cho phép bạn đặt ứng dụng không có quyền đặc biệt.

Cảm ơn bạn đã gửi Kevin từ TeslaCoil và NovaLauncher để biết thông tin về cách thực hiện điều này!

+0

Tôi đã thử tính năng này trên phiên bản 4.2.2 và nó không hoạt động ... Chỉ khi cài đặt Trình khởi chạy trang chủ mới, hành vi như bạn đã mô tả. – TacB0sS

+0

Dunno. Havent đã thử điều này trong một thời gian dài. – r2DoesInc

+1

Tôi đã thử trên 4.2.2 với Nexus 4 của tôi và nó hoạt động. –

3

giải pháp r2DoesInc không hoạt động trên thiết bị thử nghiệm 4.2.2 của tôi.
Giải pháp của tôi: Disable sau đó kích hoạt lại HomeActivity ứng dụng của tôi, nó không phải tạo 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

tôi sử dụng đoạn mã sau trên Android 4.1.2 với một ứng dụng kiosk chế độ nền tảng ký ngày một máy tính bảng công nghiệp.Nó sử dụng số điện thoại không được chấp nhận PackageManager.addPreferredActivity(), nhưng lợi thế là nó hoạt động mà không có sự tương tác của người dùng. Nó thậm chí hoạt động sau khi launcher Android tiêu chuẩn đã được chọn với tùy chọn "luôn luôn".

// 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

Bạn đã yêu cầu cấp phép như thế nào android.permission.SET_PREFERRED_APPLICATIONS trên 4.1.2 ?? Tôi thấy nó không còn được dùng nữa "Hằng số này không được chấp nhận ở cấp API 7". – umesh

+0

@umesh Tôi vừa thêm SET_PREFERRED_APPLICATIONS vào tệp kê khai. Nó không được dùng nữa, nhưng nó hoạt động với API cấp 16 (Android 4.1.2). –

Các vấn đề liên quan