package com.open.androidtvwidget.utils; import java.util.ArrayList; import java.util.List; import java.util.Set; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import android.provider.Settings; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; /** * 设置默认APP(类似小米的). <br> * 比如有很多浏览器,你可以设置默认的. <br> * 如何使用,查看DEMO,http://git.oschina.net/hailongqiu/demo-test <br> * @author hailong.qiu [email protected] * */ public class CustomApplicationHelper { private Context mContext; private PackageManager pm; public CustomApplicationHelper(Context context) { this.mContext = context; if (mContext != null) { this.pm = context.getPackageManager(); } } public List<ResolveInfo> getSpeAppResolveInfos(Intent intent) { List<ResolveInfo> resolveInfos = null; if (intent != null && pm != null) { resolveInfos = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); } return resolveInfos; } public List<InputMethodInfo> getAllInputMethod() { InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); List<InputMethodInfo> methodList = imm.getInputMethodList(); return methodList; } public void setDefaultInputMethod(InputMethodInfo info) { // 设置默认输入法. String packName = info.getPackageName(); String serviceName = info.getServiceName(); int lastIndex = serviceName.lastIndexOf("."); if (lastIndex != -1) { String setInfo = packName + "/" + serviceName.substring(lastIndex); Settings.Secure.putString(mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD, "" + setInfo); } } public boolean isDefualtInputMethod(InputMethodInfo info) { // 获取当前默认输入法. String currentInputmethod = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); if (currentInputmethod.contains("" + info.getPackageName())) { return true; } return false; } /** * 处理Intent. */ public Intent intentForResolveInfo(ResolveInfo dri, Intent initIntent) { Intent intent = new Intent(initIntent); intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); ActivityInfo ai = dri.activityInfo; intent.setComponent(new ComponentName(ai.applicationInfo.packageName, ai.name)); return intent; } /** * 设置默认APP. */ public void setDefaultApplication(Intent initIntent, ResolveInfo dri, List<ResolveInfo> resolveInfos) { // 获取 Intent. Intent intent = intentForResolveInfo(dri, initIntent); // IntentFilter filter = new IntentFilter(); // 初始化 action. if (intent.getAction() != null) { filter.addAction(intent.getAction()); } // 初始化 CATEGORY. Set<String> categories = intent.getCategories(); if (categories != null) { for (String cat : categories) { filter.addCategory(cat); } } filter.addCategory(Intent.CATEGORY_DEFAULT); // Uri data = intent.getData(); int cat = dri.match & IntentFilter.MATCH_CATEGORY_MASK; if (cat == IntentFilter.MATCH_CATEGORY_TYPE) { String mimeType = intent.resolveType(mContext); if (mimeType != null) { try { filter.addDataType(mimeType); } catch (IntentFilter.MalformedMimeTypeException e) { filter = null; } } } else if (data != null && data.getScheme() != null) { // 一般是设置了数据,比如浏览器. filter.addDataScheme(data.getScheme()); } // 设置默认应用. if (filter != null && pm != null) { final int N = resolveInfos.size(); ComponentName[] set = new ComponentName[N]; int bestMatch = 0; for (int i = 0; i < N; i++) { ResolveInfo r = resolveInfos.get(i); set[i] = new ComponentName(r.activityInfo.packageName, r.activityInfo.name); if (r.match > bestMatch) bestMatch = r.match; } pm.addPreferredActivity(filter, bestMatch, set, intent.getComponent()); } } /** * 清除默认选择. 清除之前的选项. */ public void clearDefaultApp(List<ResolveInfo> resolveInfos) { if (resolveInfos != null) { for (int i = 0; i < resolveInfos.size(); i++) { ResolveInfo resolveInfo = resolveInfos.get(i); ActivityInfo activityInfo = resolveInfo.activityInfo; String packageName = activityInfo.packageName; String className = activityInfo.name; pm.clearPackagePreferredActivities(packageName); } } } /** * 获取所有默认的APP. 注意,如果只有一个,以前没有设置过. */ public List<ComponentName> getAllDefaultApp() { List<ComponentName> activities = new ArrayList<ComponentName>(); List<IntentFilter> filters = new ArrayList<IntentFilter>(); final IntentFilter filter = new IntentFilter(Intent.ACTION_VIEW); filters.add(filter); pm.getPreferredActivities(filters, activities, null); return activities; } /** * 判断是否为默认启动项. */ public boolean isDefaultApp(String packName) { List<ComponentName> activities = getAllDefaultApp(); for (ComponentName cn : activities) { String pn = cn.getPackageName(); if (pn.equals(packName)) { return true; } } return false; } }