1. 程式人生 > >MIUI應用許可權設定

MIUI應用許可權設定

       無論你覺得我寫的好壞都可以在下面評論告訴我,你的支援是我繼續寫下去的動力,謝謝!

隨著miui越來越封閉,小米對非自由渠道的應用限制越來越苛刻,我們公司的產品一半以上的使用者都是來自小米,而且像我們這樣的靠簡訊支付維持收入的遊戲,簡訊許可權預設禁止真是要了我們的命。被加入miui黑名單的遊戲預設重要的許可權都是禁止狀態,譬如傳送簡訊許可權預設設定為禁止就直接斷了我們收入來源。因此花了幾個小時在網上搜索相關資料,我們不能幫助使用者開啟應用的許可權至少我們能夠引導使用者去開啟應用許可權,並且將引導儘可能做的很簡單。

其他廢話也不多說了,直接上程式碼

先是通過context跳轉到對應應用的許可權設定頁面:

/**
 * 跳轉到應用許可權設定頁面 http://www.tuicool.com/articles/jUby6rA 
 * @param context 傳入app 或者 activity context,通過context獲取應用packegename,之後通過packegename跳轉制定應用
 * @return 是否是miui
 */
public static boolean gotoPermissionSettings(Context context) {
	boolean mark = isMIUI();
	
	if ( mark ) {
		
		// 之相容miui v5/v6  的應用許可權設定頁面,否則的話跳轉應用設定頁面(許可權設定上一級頁面)
		try {
			Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
			localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
			localIntent.putExtra("extra_pkgname", context.getPackageName());
			context.startActivity(localIntent);
		} catch (ActivityNotFoundException e) {
			Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
			Uri uri = Uri.fromParts("package", context.getPackageName(),null);
			intent.setData(uri);
			context.startActivity(intent);
		}
	}		
	
	return mark;
}

再就是判斷是否是小米的裝置,官方為我們提供了一種簡單方便的辦法:
/**
 * 檢查手機是否是miui
 * @ref http://dev.xiaomi.com/doc/p=254/index.html
 * @return
 */
public static boolean isMIUI(){
	String device = Build.MANUFACTURER;
	System.out.println( "Build.MANUFACTURER = " + device );
	if ( device.equals( "Xiaomi" ) ) {
		System.out.println( "this is a xiaomi device" );
		return true;
	}
	else{
		return false;
	}		
}

我們同樣也可以使用類似查詢activtiy的方式判斷是否是miui,但是這種方式同樣存在相容的問題,不是很推薦,也附上程式碼供大家參考:

/**
 * 判斷是否是miui V5/V6,老的miui無法相容
 * @param context
 * @return
 */
public static boolean isMIUIv5v6(Context context) {
	boolean result = false;
	Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
	localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
	if (isIntentAvailable(context, localIntent)) {
		result = true;
	}
	return result;
}

/**
 * 檢查是否有這個activity
 * @param context
 * @param intent
 * @return
 */
private static boolean isIntentAvailable(Context context, Intent intent) {
	PackageManager packageManager = context.getPackageManager();
	List<ResolveInfo> list = packageManager.queryIntentActivities(
			intent, PackageManager.GET_ACTIVITIES);
	return list.size() > 0;
}

以下是完整的程式碼,可以直接使用的類:

public class SetMiuiPermission {

	/**
	 * 跳轉到應用許可權設定頁面 http://www.tuicool.com/articles/jUby6rA 
	 * @param context 傳入app 或者 activity context,通過context獲取應用packegename,之後通過packegename跳轉制定應用
	 * @return 是否是miui
	 */
	public static boolean gotoPermissionSettings(Context context) {
		boolean mark = isMIUI();
		
		if ( mark ) {
			
			// 之相容miui v5/v6  的應用許可權設定頁面,否則的話跳轉應用設定頁面(許可權設定上一級頁面)
			try {
				Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
				localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
				localIntent.putExtra("extra_pkgname", context.getPackageName());
				context.startActivity(localIntent);
			} catch (ActivityNotFoundException e) {
				Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
				Uri uri = Uri.fromParts("package", context.getPackageName(),null);
				intent.setData(uri);
				context.startActivity(intent);
			}
		}		
		
		return mark;
	}
	
	/**
	 * 檢查手機是否是miui
	 * @ref http://dev.xiaomi.com/doc/p=254/index.html
	 * @return
	 */
	public static boolean isMIUI(){
		String device = Build.MANUFACTURER;
		System.out.println( "Build.MANUFACTURER = " + device );
		if ( device.equals( "Xiaomi" ) ) {
			System.out.println( "this is a xiaomi device" );
			return true;
		}
		else{
			return false;
		}		
	}

	/**
	 * 判斷是否是miui V5/V6,老的miui無法相容
	 * @param context
	 * @return
	 */
	public static boolean isMIUIv5v6(Context context) {
		boolean result = false;
		Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
		localIntent.setClassName("com.miui.securitycenter","com.miui.permcenter.permissions.AppPermissionsEditorActivity");
		if (isIntentAvailable(context, localIntent)) {
			result = true;
		}
		return result;
	}

	/**
	 * 檢查是否有這個activity
	 * @param context
	 * @param intent
	 * @return
	 */
	private static boolean isIntentAvailable(Context context, Intent intent) {
		PackageManager packageManager = context.getPackageManager();
		List<ResolveInfo> list = packageManager.queryIntentActivities(
				intent, PackageManager.GET_ACTIVITIES);
		return list.size() > 0;
	}
}
以上函式的入口為:gotoPermissionSettings,傳入當前application的context即可條狀到當前應用的許可權設定頁面。