精华内容
下载资源
问答
  • MIUI应用权限设置

    千次阅读 2015-07-25 17:11:23
    随着miui越来越封闭,小米对非自由渠道的应用限制越来越苛刻,我们公司的...因此花了几个小时在网上搜索相关资料,我们不能帮助用户打开应用的权限至少我们能够引导用户去打开应用权限,并且将引导尽可能做的很简单。

           无论你觉得我写的好坏都可以在下面评论告诉我,你的支持是我继续写下去的动力,谢谢!

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


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

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

    资料三:完整demo下载地址 http://download.csdn.net/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即可条状到当前应用的权限设置页面。


    展开全文
  • 部分手机读取应用列表权限

    万次阅读 2018-08-08 15:20:39
    部分手机比如小米,华为在权限管理那里有个读取应用列表的权限,这个读取应用列表的权限不需要申请,部分手机系统默认就有的,并且默认打开。某型号小米手机关闭读取应用列表权限后仍然可以手机安装的第三方应用,...

    部分手机比如小米,华为在权限管理那里有个读取应用列表的权限,这个读取应用列表的权限不需要申请,部分手机系统默认就有的,并且默认打开。某型号小米手机关闭读取应用列表权限后仍然可以手机安装的第三方应用,华为手机关闭读取应用列表权限后不能读取第三方应用列表,只可以读取系统应用。由于没有对应的权限,查看源码也没有对应的方法可以确定开关的状态(貌似原生应用是没有这个权限的,应该是不同的手机厂商定制的,所以需要根据不同牌子的手机来处理)。查不同ROM手机系统源码来获取开关状态肯定是行不通的,所以只能曲线救国了,先获取第三方应用,能获取就不管了,不能获取就提示用户去权限管理里面打开读取应用列表权限。代码如下:(只适配了华为手机)

    if(android.os.Build.BRAND.equalsIgnoreCase("huawei") || android.os.Build.BRAND.equalsIgnoreCase("honor")){
        getAll();
    }else{
        initBqsDFSDK(MainFQActivity.this);
        BqsDF.commitLocation(GlobalConfig.getLocation()[1],GlobalConfig.getLocation()[0]);
    }
    private void getAll(){
        ArrayList<String> appNames = new ArrayList<>();
        PackageManager pm = getPackageManager();
        try {
            List<PackageInfo> packageInfoList = pm.getInstalledPackages(0);
            for(int i=0;i<packageInfoList.size();i++){
                PackageInfo packageInfo = packageInfoList.get(i);
                String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
                if(TextUtils.isEmpty(appName)){
                    appName = packageInfo.packageName;
                }
                if((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM )<= 0){
                    if(!packageInfo.packageName.equals(getPackageName())) {
                        appNames.add(appName);
                        break;
                    }
                }
            }
            if(appNames.size() <= 0){
                AlertDialog.Builder builder = new AlertDialog.Builder(this)
                        .setMessage("该应用需要读取已安装应用列表权限,请前往开启该应用的读取已安装应用列表的权限")
                        .setPositiveButton("去设置", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                try {
                                    Intent intent = new Intent();
                                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");//华为权限管理
                                    intent.setComponent(comp);
                                    startActivity(intent);
                                } catch (Exception e) {
                                    e.printStackTrace();
                                    Intent localIntent = new Intent();
                                    localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                                    localIntent.setData(Uri.fromParts("package", getPackageName(), null));
                                    startActivity(localIntent);
                                }
                                dialog.dismiss();
                            }
                        });
                builder.create().show();
            }else{
                initBqsDFSDK(MainFQActivity.this);
                BqsDF.commitLocation(GlobalConfig.getLocation()[1],GlobalConfig.getLocation()[0]);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

     

    展开全文
  • Android 笔记之 设置应用权限

    千次阅读 2016-08-31 01:10:46
    设置应用权限

    设置应用的权限

    我使用过的2.3系统的android手机,安装APP的时候会显示一个对话框,里面有这个APP所需要的权限。
    如果点击安装,就默认同意了这些权限的请求。

    后来系统升级到了5.0时代,这个新的手机新的系统会在安装APP之后显示一个可以操作的对话框,
    里面显示APP请求了那些权限,每一个权限你都可以选择确认或者拒绝。如果拒绝了,在操作APP的时候,需要相应权限的时候或说明
    “你没有XXX权限”等类似的东西

    以上的说明不一定是普遍情况,可能是不同的厂商对于原始android系统进行更改以后的结果。能操作具体权限当然要更加人性化一些。

    这篇笔记是基于学习6.0以上系统开发的时候做的,因此都会更新到最新的6.0以上系统的操作,例如可以在运行的时候选择权限,等等。

    声明权限

    权限这个很好理解,就是需要使用什么功能,比如摄像头,使用internet,读取短信等等。这些都是系统里面有默认接口的。

    但是,你只需要请求那些你直接使用的权限,如果你的APP是通过一个intent调用其他app,比如调用系统默认照相程序,那么不需要权限。
    如果你需要直接调用摄像头,获得摄像头的直接输出,那就需要声明一个权限。

    我们可以在Manifast.xml文件里面声明权限。
    添加一个<user-permision>节点,然后在里面定义。

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.example.snazzyapp">
    
        <uses-permission android:name="android.permission.SEND_SMS"/>
    
    
        <application ...>
            ...
        </application>
    
    </manifest>

    关于权限的介绍from developer.android

    接下来

    权限分为normal permissions和dangerous permisions,前者在声明以后,可以自动获取,不需要用户操作。
    而后者,都是有关于硬件,用户隐私信息等关键问题的权限,所以需要手动获取。
    在6.0之前,是安装的时候确认权限,如果不允许,就只能放弃安装。6.0之后,可以在运行的时候针对某一项权限允许或者拒绝。
    注,这是默认系统的运行方式,很多厂商会有一些更改,比如三星的5.1系统就可以在安装的时候对权限进行分开确认

    运行时获取权限

    Requesting Permissions at Run Time

    android Support Library 提供了一些关于权限的方法,这些在Android 6.0 (API level23)也提供。但是Support Library可以提供更广的API LEVEL支持

    检查权限
    ContextCompat.checkSelfPermission()方法可以用来检查权限状况,例如

    // Assume thisActivity is the current activity
    int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.WRITE_CALENDAR);

    检查是否有这个权限,如果有,就返回PackageManager.PERMISSION_GRANTED,然后程序可以继续运行。
    如果没有,就会返回PERMISSION_DENIED,那么就必须获得该权限。

    获取权限
    requestPermissions()可以用来获取权限,正如文档上所述的使用方法:

    // Here, thisActivity is the current activity
    if (ContextCompat.checkSelfPermission(thisActivity,
                    Manifest.permission.READ_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {
    
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                Manifest.permission.READ_CONTACTS)) {
    
            // Show an expanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
    
        } else {
    
            // No explanation needed, we can request the permission.
    
            ActivityCompat.requestPermissions(thisActivity,
                    new String[]{Manifest.permission.READ_CONTACTS},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);
    
            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    }

    注意一点,如果你需要打开一个信息框,向用户解释为什么需要这个权限,你就必须在调用requestPermissions()之前做,
    因为调用这个以后你不能操作你的APP,除非用户选择确认或者拒绝。

    确认操作
    刚才已经打开了请求权限的对话框,那么如何确认操作以及应对呢
    可以在ACTIVITY中覆盖一个方法,onRequestPermissionsResult。正如文档里的描述

    @Override
    public void onRequestPermissionsResult(int requestCode,
            String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
    
                } else {
    
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
    
            // other 'case' lines to check for other
            // permissions this app might request
        }
    }

    这里的requestCode就是之前定义在requestPermissions方法里面的第三个参数,可以根据自己的设计来自定义。
    也就是说,这个方法里面定义了所有关于权限的操作,每个权限对应一个switch的case。

    最后,官方文档有关获取权限操作的建议
    Permissions Best Practices

    备注,关于permission的一些说明

    1,当我实际操作的时候发现,在获取权限的时候直接使用requestPermissions方法,就会在屏幕上打出关于本权限的一些说明,如果选择允许,或者拒绝,就会触发onRequestPermissionsResult

    也就是说,即便不做任何关于说明的操作,也会给予足够多的说明让用户来了解。
    上面将的shouldShowRequestPermissionRationale实际上是为了给用户更多的信息,比如为什么一个相机应用需要GPS权限,等等。

    2,当我需要获取写入系统设定权限的时候,失败了,根本没有执行。
    然后我就在官方API文档找到这么一段

    WRITE_SETTINGS
    Note: If the app targets API level 23 or higher, the app user must explicitly grant this permission >to the app through a permission management screen. The app requests the user’s approval by >sending an intent with action ACTION_MANAGE_WRITE_SETTINGS. The app can check whether it >has this authorization by calling Settings.System.canWrite().

    就是说,如果API大于23,那么需要获取WRITE_SETTINGS权限的时候需要这么操作:发送一个intent
    ACTION是 Settings.ACTION_MANAGE_WRITE_SETTINGS,也就是打开系统的一个菜单,选择是否允许你的APP来控制设定。
    检查权限也不一样,需要用方法Settings.System.canWrite()

    不知道设计人是怎么想的。

    展开全文
  • 安卓项目没任何问题,项目里权限设置也没问题,手机运行还是不能录音,解决方法: 红米4:设置->授权管理->应用权限管理->点击应用名字->录音->允许 这是我测试腾讯云游戏语音的例子VoiceTutorial_cocos2dx发现的...

    安卓项目没任何问题,项目里权限设置也没问题,手机运行还是不能录音,解决方法:

    红米4:设置->授权管理->应用权限管理->点击应用名字->录音->允许

    这是我测试腾讯云游戏语音的例子VoiceTutorial_cocos2dx发现的问题


    20170211此外,安卓项目还必须在BuildPath里加android-support-v4.jar,否则也录音失败
    
    展开全文
  • adb授予安卓手机应用权限

    万次阅读 2019-12-27 15:12:11
    有些具有侵略性的权限无法直接被申请,但是一般手机有个设置可以规避这个问题,以realMe为例 解决方法: realme:打开禁止权限监控   华为手机暂时未发现此项设置,但是可以直接使用   脑残...
  • 乐视手机调用自启动管理, String ACTION_PERMISSION_AUTOBOOT = ...乐视手机调用应用权限管理 String ACTION_PERMISSION_AUTOBOOT = “com.letv.android.permissionandapps”;/*** * 适配乐视手机, 跳转到自启
  • Android 打开应用权限设置页面

    千次阅读 2017-12-13 11:39:50
    1.首先判断自己的应用的通知权限是否开启 private static String CHECK_OP_NO_THROW = "checkOpNoThrow"; private static String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION"; /** * 判断该应用通知开关...
  • 最近写个应用,需要电源管理权限,这个权限只有系统应用才有,到网上查了下解决方法,说是在配置文件加uid.system这个属性,然后再用系统的platform密钥文件对应用签名,这样得到的apk就可以调用系统权限了,可是搞...
  • 危险权限,获取应用权限列表

    千次阅读 2018-08-08 15:34:54
    获取应用所需权限(只能获取在AndroidManifest.xml文件中声明的权限,像手机设置-》权限管理-》应用-》权限列表这个里面的权限并不是都能获取,比如读取应用列表的权限就获取不到) PackageInfo pkgInfo = ...
  • 跳转应用设置页面方便用户修改已拒绝的权限,是经常遇到的需求,但是MIUI 8 系统上测试发现有坑,写一篇文章记录一下。
  • vivo手机权限禁止–跳转至对应app的权限设置页面 开始我用的这个方法在vivo 酷派,oopo上:(在vivo上已不能使用) private void doStartApplicationWithPackageName(String packagename) { // 通过包名获取此APP...
  • 2.打开 “设置”去更改该应用权限(比如将“存储”权限由授权状态改为非授权状态)。 3.再将该应用重新切换到前台,会发现应用进行了重新启动。 因为,为了更好的用户体验,需要格外注意并处理。* 另外需要注意...
  • 调试华为手机时,USB数据线连接电脑之后,弹出----- ...有应用遮挡了权限请求界面的提示,设置应用无法验证, 想问解决办法?你是不是打开了桌面悬浮球?而且还在屏幕右侧?好的,把小球挪到屏幕左侧试试吧? ...
  • 如果已经允许了一个权限比如(读取通讯权限),此刻去调用相机,弹出权限申请对话框,此刻点击拒绝,然后经过处理后弹出去设置权限界面(因为权限总归是要申请),如果再在置界面里打开应用权限设置,此刻不但不打开...
  • android 项目中怎么用代码判断手机的某项应用权限是否允许或者禁止,比如拍照权限,定位权限,,,这些权限在manifest 配置文件中多已经配置过了,
  • op 的值是 0 ~ 47,其中0代表粗略定位权限,1代表精确定位权限,24代表悬浮窗权限。(具体可以看) uid 当前应用用到的uid ,可通过 Binder.getCallingUid()获得。 packageName 应用程序的包名,通过getPackageName...
  • android 跳转到应用权限设置界面

    千次阅读 2017-05-16 10:05:04
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromParts("package", getPackageName(), null);...
  • 本文摘自《Delphi XE8 iOS与Android移动应用开发教程[完整中文版]》,该书是一本介绍使用delphi xe8开发iOS与Android...本节内容主要介绍使用Delphi XE系列工具开发Android应用时需要使用到的Android相关权限设置内容。
  • 【第一个问题获取手机中所有应用的包名与权限】 有时候你的App需要跳转到其他的App,你需要知道他的包名,最简单的方法就是通过Android自带的方法去获取了。一般的包名都是能够一眼看出来的,要么是应用名的拼音...
  • 因此在我们开发过程中想调出某应用的权限设置页面,调出的是google原生的权限控制界面,但是我们在此页授予应用权限后,实际上应用还是没有权限,只是在google眼里,我已经给你权限了。其实,是被手机厂商系统给拦截...
  • http://blog.csdn.net/lan410812571/article/details/41960425Android在开发中有时候要判断应用中是否有某项权限,或者想获取到某个应用权限清单,可以使用以下方法1) 判断应用是否具有某个权限[java] view plain ...
  • 前几天导入新工程,用的别人的代码,打包以后发现部分华为手机和小米手机安装签名打包的apk文件老是提示安装失败,说是与已安装应用权限冲突,有的说将开发者选项miui优化关闭即可,但是试了不管用,还有的说是...
  • 无需ROOT卸载手机自带软件—— Android篇 1、什么 是root??? Root,也称为根用户,是Unix(如Solaris、AIX、BSD)和类UNIX系统(如Linux、QNX等),及Android和iOS移动设备系统中的唯一的超级用户,因其可对根目录执行...
  • Android中应用调用系统权限

    千次阅读 2017-03-02 11:24:05
    现在设备的安全性越来越受到重视,随之而来的便是开发中的各种不便,比如有普通权限,运行时权限,系统权限之分。...chapter one 系统应用添加系统权限 对于可以编译到源码里的apk添加系统权限很简单,
  • 因为项目要用到推送功能,所以需要知道用户是否开启了通知栏的权限,并且可以方便直接跳转到权限设置以便用户进行开启。 获取权限工具类 public class NotificationsUtils { private static final String CHECK_...
  • 问题就是申请相机权限时点击拒绝,再次提示时点击拒绝且不再提醒,然后后台设置中再打开相关权限,进入app再次申请权限,拿不到刚才设置中的状态, 解决方案: 直接在开发者选项中 把MIUI优化选项打开,退出应用 ...
  • 在uni-app中如何配置权限 首先,我们先通过API了解,他对权限的需求,比如在上个帖子中 ===>>对APP后台静默更新升级对文件管理和文件下载权限的需求 当时我们使用了这个权限: android.permission.WRITE_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 127,454
精华内容 50,981
关键字:

怎么设置手机应用权限