MIUI应用权限设置

       不管你认为我写的好坏都能够在以下评论告诉我,你的支持是我继续写下去的动力,谢谢。

随着miui越来越封闭,小米对非自由渠道的应用限制越来越苛刻。我们公司的产品一半以上的用户都是来自小米,并且像我们这种靠短信支付维持收入的游戏,短信权限默认禁止真是要了我们的命。被增加miui黑名单的游戏默认重要的权限都是禁止状态,譬如发送短信权限默认设置为禁止就直接断了我们收入来源。因此花了几个小时在网上搜索相关资料。我们不能帮助用户打开应用的权限至少我们可以引导用户去打开应用权限,并且将引导尽可能做的非常easy。


资料一:跳转miui应用权限设置页面(之兼容V5/V6老版本号仅仅跳转上一级界面就可以)http://www.tuicool.com/articles/jUby6rA

资料二:推断当前设备是否是小米 http://dev.xiaomi.com/doc/p=254/index.html

资料三:完整demo下载地址 http://download.youkuaiyun.com/detail/tgbus18990140382/8932881


其它废话也不多说了。直接上代码

先是通过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就可以条状到当前应用的权限设置页面。




### HRTF算法原理及应用 #### HRTF的基本原理 HRTF(Head Related Transfer Function,头部相关传递函数)是一种用于模拟三维空间声音定位的数字信号处理技术。其核心思想是通过数学模型来描述声音从声源传播到双耳过程中所受到的物理影响,包括头部、耳廓、耳道等结构对声波的反射、折射和衍射效应。 在实际环境中,当一个声音到达人的耳朵时,由于人体结构的影响,不同方向的声音会具有不同的频谱特征。大脑利用这些特征以及时间差和强度差来判断声音的方向。HRTF通过测量或计算特定方向下的这些特征,并将其表示为一对滤波器(分别对应左右耳),从而使得经过HRTF处理的声音能够在立体声耳机上重现原始的空间位置感[^1]。 #### HRTF的数据获取 为了构建准确的HRTF数据集,通常需要进行精确的测量实验。实验中使用人工头模型或者真人受试者,在自由场条件下放置多个扬声器于不同的方位角和仰角,然后记录每个位置处由扬声器发出的测试信号经过人头与耳朵后的响应。随后,将采集到的数据转换成频率域的形式,形成对应的HRTF滤波器组。这种个性化定制的数据能够提供更加真实的听觉体验,但同时也增加了获取成本[^1]。 #### HRTF的应用领域 - **虚拟现实(VR)与增强现实(AR)**:在VR/AR系统中,HRTF被用来创建沉浸式的音频环境,让用户即使闭着眼睛也能感知到周围世界的存在及其变化。 - **游戏开发**:特别是在射击类游戏中,玩家可以通过脚步声、枪击声等音效快速识别敌人的具体方位,提高游戏的真实性和互动性[^2]。 - **远程会议系统**:借助HRTF技术可以实现更自然的多方通话体验,让参与者更容易分辨说话者的身份。 - **助听设备**:对于某些类型的助听器而言,采用适当的HRTF策略可以帮助佩戴者更好地理解来自各个方向的声音信息。 #### HRTF面临的挑战 尽管HRTF提供了强大的空间音频解决方案,但在实际应用过程中仍然存在一些难题: - 个性化问题:每个人的身体构造都有所差异,因此通用型HRTF可能无法达到最佳效果; - 计算复杂度高:实时应用时需要大量的运算资源来执行卷积操作; - 动态跟踪:如果用户头部移动,则必须相应调整应用的HRTF以保持正确的空间感知。 针对上述问题的研究正在不断推进之中,比如通过机器学习方法预测个性化的HRTF参数、优化算法减少计算负担等手段来改善用户体验。 ```python import numpy as np from scipy.signal import convolve def apply_hrtf(audio_signal, hrtf_left, hrtf_right): """ Apply HRTF filters to mono audio signal to create binaural output. :param audio_signal: Mono input signal (numpy array) :param hrtf_left: Left ear HRTF filter coefficients (numpy array) :param hrtf_right: Right ear HRTF filter coefficients (numpy array) :return: Binaural output (numpy array with shape [length, 2]) """ left_channel = convolve(audio_signal, hrtf_left, mode='full') right_channel = convolve(audio_signal, hrtf_right, mode='full') return np.column_stack((left_channel, right_channel)) ``` 该代码示例展示了如何将给定方向的HRTF应用于单声道音频信号以生成双声道输出。这里使用了`scipy.signal.convolve`函数来进行卷积运算,这是实现HRTF效果的关键步骤之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值