-
2021-06-08 02:36:11
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。
以安卓手机获取通讯录为例,开启获取手机信息权限的方法:
1、打开【安全中心】,进入【授权管理】。
2、选择【应用权限管理】。
3、选择【应用管理】。
4、在应用列表中找到想要开通权限的应用,点击进入。
5、在权限列表中找到【读取联系人】。
6、点击【读取联系人】,在下方弹出来的选项中选择“允许”即可。
有几项技术可以解决非结构化数据的安全,但是一旦数据离开网络,这些安全技术就会因为不能控制数据迁移后的环境而失去效果。这些技术有一个共同点,安全控制绑定在数据本身之外,例如网络或者计算机周边设备。不管数据传输至何处,只有一种技术能完全保护数据的访问。它对元数据建立分类、访问控制以及有关个人用户允许访问数据的权限信息,该解决方案被称为信息权限管理(IRM)。
启用 IRM 的文档包含内容许可。内容许可包含电子邮件地址、权限信息和身份验证信息。每当有人试图打开启用 IRM 的文档时,Office Word 2003 都将根据该用户的标识检查保存在文档中的内容许可。如果该用户以前从未打开该文档,Office Word 2003 将与 IRM 服务器联系,验证该用户的标识,为其下载新的内容许可(假设该用户具有所需的权限),并将该内容许可保存到文档。
更多相关内容 -
是否允许应用获取设备信息_手机权限获取弹窗不断,隐私安全如何确保,这些权限需谨慎...
2020-10-27 17:19:03安卓手机在安装软件的时候,总是会要求获取各种权限,除了...一、软件权限获取问题我们在软件刚安装的时候,都会检查权限设置,但是有时候,一些软件授权后,使用时间久了,我们要如何查看它都曾经获取过什么权限呢...安卓手机在安装软件的时候,总是会要求获取各种权限,除了一些必要权限外,有时还会索要一些敏感权限,如:电话、联系人等权限。工信部也在去年,展开了一次大规模的整顿,,现在很多软件拒绝了权限,也是可以使用的。不过接下来,每使用一次,就会弹出一次请求,也是让人头大。
一、软件权限获取问题
我们在软件刚安装的时候,都会检查权限设置,但是有时候,一些软件授权后,使用时间久了,我们要如何查看它都曾经获取过什么权限呢?
1、应用查看
我们可以通过「设置—应用管理」,点击要查询的软件,通过其中的「权限管理」,查看软件锁索取的所有权限。
2、权限查看
我们也可以直接通过「设置—权限管理」,查看各个权限下的应用获取情况,这个可以帮助我们清晰的看到都有什么软件获取了这一权限,更加方便管理。
二、权限获取是否泄漏隐私
面对软件的各种权限获取,你是否会担心自己的隐私因此而泄露呢?你是否会为了使用软件,而同意一些不合理的获取要求呢? 在软件要求下面几项权限时,你一定要特别注意哦!
1、读取短信
现在我们已经很少使用短信了,不过,在使用软件中,有时候会需要使用到验证码,这是我们使用软件的临时身份证。所以,在允许短信权限时也要很小心。
2、联系人、电话
在这一点上,大家应该都是十分小心的,以免好友信息、联系人信息泄露,被作为信息出卖等。
3、获取位置
现在很多的软件都会有获取定位权限,但其实除了一些地图软件外,其他的软件很多是不需要这一点的,所以,为了防止我们的位置信息泄露,着一个权限在很多软件中是并不需要授予的。
4、获取相机
获取相机权限,这在很多APP上都会出现,而对于这个权限,可能很多人都不是特别在意。但是需要注意的是,相机权限获取的可能不仅仅是手机摄像头,同时也会对相册进行扫描,泄露我们的图片信息。
三、解除权限
那么,如果当我们想要解除某一软件权限时,又该怎么做呢?
1、禁止权限使用
我们可以按照第一步介绍的两种方法,分别从「应用管理」和「权限管理」两个入口,来解除软件权限获取。点击页面内的某一具体权限,就,然后在弹出的新窗口中选择“拒绝”,就可以关闭授权了。
2、仅运行时允许
而如果你是“Android 10”用户的话,还可以通过选择“仅运行是允许”来设置软件权限获取,这样可以保证软件的正常使用,也可以防止软件在后台持续获取信息,比“询问”设置更加方便省心。
好了,以上就是今天介绍的有关手机权限获取的相关内容了,觉得有用的记得点赞哦。如果你对权限获取有自己的独特见解,也欢迎在评论区讨论哦!
-
Android 设备信息获取详解
2020-11-16 07:59:19和你一起终身学习,这里是程序员Android经典好文推荐,通过阅读本文,您将收获以下知识点:一、获取手机基本信息(厂商、型号等参数)二、设备信息获取实现图三、获取手机设备 宽、高、IME...和你一起终身学习,这里是程序员Android
经典好文推荐,通过阅读本文,您将收获以下知识点:
一、获取手机基本信息(厂商、型号等参数)
二、设备信息获取实现图
三、获取手机设备 宽、高、IMEI 信息
四、获取手机厂商名、产品名、手机品牌、手机型号、主板名、设备名
五、获取手机硬件名、SDK版本、android版本 、语言支持、默认语言
六、获取 SD 卡存储信息
七、获取手机 RAM、ROM存储信息
八、DeviceInfoUtils 封装类
九、SDCardUtils 封装类下面将讲解以上信息的获取方法。
一、 获取手机基本信息(厂商、型号等参数)
以小米手机为例,手机常用的基本信息可以在
Settings
-->About Phone
中看到,
例如下图:小米手机设备信息图
那么如何获取这些设备信息呢?
Android
中 通常通过android.os.Build
类方法可以获取更多手机设备信息。二、 设备信息获取实现图
获取手机IMEI、宽、高、是否有SD卡,RAM、ROM、SD卡、是否联网、网络类型
默认语言,设备名,型号、厂商、Fingerprint、Android 版本、SDK版本、Google 安全patch、发布时间、版本类型、用户名
产品名、ID、产品名、主板名
三、 获取手机设备 宽、高、IMEI 信息方法
获取手机宽、高、
IMEI
信息方法如下:/** * 获取设备宽度(px) * */ public static int getDeviceWidth(Context context) { return context.getResources().getDisplayMetrics().widthPixels; } /** * 获取设备高度(px) */ public static int getDeviceHeight(Context context) { return context.getResources().getDisplayMetrics().heightPixels; } /** * 获取设备的唯一标识, 需要 “android.permission.READ_Phone_STATE”权限 */ public static String getIMEI(Context context) { TelephonyManager tm = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); String deviceId = tm.getDeviceId(); if (deviceId == null) { return "UnKnown"; } else { return deviceId; } }
注意:获取
IMEI
需要获取手机状态权限<!-- 读取手机IMEI的设备权限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
如果是
Android 6.0
之后的代码请使用动态申请权限的方法申请权限,否认会报安全异常的错误SecurityException
,进而导致运行报错。如需了解更多 系统安全权限的内容,请看 之前写的文章 Android 系统权限使用详解
四、 获取手机厂商名、产品名、手机品牌、手机型号、主板名、设备名的方法
获取手机厂商名、产品名、手机品牌、手机型号、主板名、设备名的方法如下:
/** * 获取厂商名 * **/ public static String getDeviceManufacturer() { return android.os.Build.MANUFACTURER; } /** * 获取产品名 * **/ public static String getDeviceProduct() { return android.os.Build.PRODUCT; } /** * 获取手机品牌 */ public static String getDeviceBrand() { return android.os.Build.BRAND; } /** * 获取手机型号 */ public static String getDeviceModel() { return android.os.Build.MODEL; } /** * 获取手机主板名 */ public static String getDeviceBoard() { return android.os.Build.BOARD; } /** * 设备名 * **/ public static String getDeviceDevice() { return android.os.Build.DEVICE; } /** * * * fingerprit 信息 * **/ public static String getDeviceFubgerprint() { return android.os.Build.FINGERPRINT; }
五、 获取手机硬件名、SDK版本、android版本 、语言支持、默认语言等方法
获取手机硬件名、
SDK版本
、android版本
、语言支持、默认语言等方法如下:/** * 硬件名 * * **/ public static String getDeviceHardware() { return android.os.Build.HARDWARE; } /** * 主机 * * **/ public static String getDeviceHost() { return android.os.Build.HOST; } /** * * 显示ID * **/ public static String getDeviceDisplay() { return android.os.Build.DISPLAY; } /** * ID * * **/ public static String getDeviceId() { return android.os.Build.ID; } /** * 获取手机用户名 * * **/ public static String getDeviceUser() { return android.os.Build.USER; } /** * 获取手机 硬件序列号 * **/ public static String getDeviceSerial() { return android.os.Build.SERIAL; } /** * 获取手机Android 系统SDK * * @return */ public static int getDeviceSDK() { return android.os.Build.VERSION.SDK_INT; } /** * 获取手机Android 版本 * * @return */ public static String getDeviceAndroidVersion() { return android.os.Build.VERSION.RELEASE; } /** * 获取当前手机系统语言。 */ public static String getDeviceDefaultLanguage() { return Locale.getDefault().getLanguage(); } /** * 获取当前系统上的语言列表(Locale列表) */ public static String getDeviceSupportLanguage() { Log.e("wangjie", "Local:" + Locale.GERMAN); Log.e("wangjie", "Local:" + Locale.ENGLISH); Log.e("wangjie", "Local:" + Locale.US); Log.e("wangjie", "Local:" + Locale.CHINESE); Log.e("wangjie", "Local:" + Locale.TAIWAN); Log.e("wangjie", "Local:" + Locale.FRANCE); Log.e("wangjie", "Local:" + Locale.FRENCH); Log.e("wangjie", "Local:" + Locale.GERMANY); Log.e("wangjie", "Local:" + Locale.ITALIAN); Log.e("wangjie", "Local:" + Locale.JAPAN); Log.e("wangjie", "Local:" + Locale.JAPANESE); return Locale.getAvailableLocales().toString(); }
六、 获取 SD 卡存储信息
SD卡信息
1.判断SD是否挂载方法
判断
SD
是否挂载方法如下:/** * 判断SD是否挂载 */ public static boolean isSDCardMount() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); }
2. 获取SD 存储信息的方法
获取
SD
存储信息的方法如下:/** * 获取手机存储 ROM 信息 * * type:用于区分内置存储于外置存储的方法 * * 内置SD卡 :INTERNAL_STORAGE = 0; * * 外置SD卡:EXTERNAL_STORAGE = 1; * **/ public static String getStorageInfo(Context context, int type) { String path = getStoragePath(context, type); /** * 无外置SD 卡判断 * **/ if (isSDCardMount() == false || TextUtils.isEmpty(path) || path == null) { return "无外置SD卡"; } File file = new File(path); StatFs statFs = new StatFs(file.getPath()); String stotageInfo; long blockCount = statFs.getBlockCountLong(); long bloackSize = statFs.getBlockSizeLong(); long totalSpace = bloackSize * blockCount; long availableBlocks = statFs.getAvailableBlocksLong(); long availableSpace = availableBlocks * bloackSize; stotageInfo = "可用/总共:" + Formatter.formatFileSize(context, availableSpace) + "/" + Formatter.formatFileSize(context, totalSpace); return stotageInfo; }
3. 获取手机ROM (内置存储,外置存储)存储路径的方法
获取手机
ROM
存储信息的方法如下:/** * 使用反射方法 获取手机存储路径 * * **/ public static String getStoragePath(Context context, int type) { StorageManager sm = (StorageManager) context .getSystemService(Context.STORAGE_SERVICE); try { Method getPathsMethod = sm.getClass().getMethod("getVolumePaths", null); String[] path = (String[]) getPathsMethod.invoke(sm, null); switch (type) { case INTERNAL_STORAGE: return path[type]; case EXTERNAL_STORAGE: if (path.length > 1) { return path[type]; } else { return null; } default: break; } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 获取 手机 RAM 信息 方法 一 * */ public static String getTotalRAM(Context context) { long size = 0; ActivityManager activityManager = (ActivityManager) context .getSystemService(context.ACTIVITY_SERVICE); MemoryInfo outInfo = new MemoryInfo(); activityManager.getMemoryInfo(outInfo); size = outInfo.totalMem; return Formatter.formatFileSize(context, size); } /** * 手机 RAM 信息 方法 二 * */ public static String getTotalRAMOther(Context context) { String path = "/proc/meminfo"; String firstLine = null; int totalRam = 0; try { FileReader fileReader = new FileReader(path); BufferedReader br = new BufferedReader(fileReader, 8192); firstLine = br.readLine().split("\\s+")[1]; br.close(); } catch (Exception e) { e.printStackTrace(); } if (firstLine != null) { totalRam = (int) Math.ceil((new Float(Float.valueOf(firstLine) / (1024 * 1024)).doubleValue())); long totalBytes = 0; } return Formatter.formatFileSize(context, totalRam); } /** * 获取 手机 可用 RAM * */ public static String getAvailableRAM(Context context) { long size = 0; ActivityManager activityManager = (ActivityManager) context .getSystemService(context.ACTIVITY_SERVICE); MemoryInfo outInfo = new MemoryInfo(); activityManager.getMemoryInfo(outInfo); size = outInfo.availMem; return Formatter.formatFileSize(context, size); }
七、获取手机 RAM、ROM存储信息
1.RAM:
运行时内存,此大小直接决定手机运行的流畅度,相当于电脑内存。
2.ROM :
手机存储(分内置
SD卡
,外置SD卡
),此大小直接决定着手机可以存储资源的大小,相当于电脑硬盘。以红米手机为例:
RAM= 1904716KB= 1.82G
红米4 手机 RAM、ROM存储信息
红米4 memory 信息 meminfo
3.获取
RAM
存储信息的方法如下:/** * 获取 手机 RAM 信息 * */ public static String getRAMInfo(Context context) { long totalSize = 0; long availableSize = 0; ActivityManager activityManager = (ActivityManager) context .getSystemService(context.ACTIVITY_SERVICE); MemoryInfo memoryInfo = new MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); totalSize = memoryInfo.totalMem; availableSize = memoryInfo.availMem; return "可用/总共:" + Formatter.formatFileSize(context, availableSize) + "/" + Formatter.formatFileSize(context, totalSize); }
4. 获取手机
ROM
存储信息的方法如下:/** * 获取手机存储 ROM 信息 * * type:用于区分内置存储于外置存储的方法 * * 内置SD卡 :INTERNAL_STORAGE = 0; * * 外置SD卡:EXTERNAL_STORAGE = 1; * **/ public static String getStorageInfo(Context context, int type) { String path = getStoragePath(context, type); /** * 无外置SD 卡判断 * **/ if (isSDCardMount() == false || TextUtils.isEmpty(path) || path == null) { return "无外置SD卡"; } File file = new File(path); StatFs statFs = new StatFs(file.getPath()); String stotageInfo; long blockCount = statFs.getBlockCountLong(); long bloackSize = statFs.getBlockSizeLong(); long totalSpace = bloackSize * blockCount; long availableBlocks = statFs.getAvailableBlocksLong(); long availableSpace = availableBlocks * bloackSize; stotageInfo = "可用/总共:" + Formatter.formatFileSize(context, availableSpace) + "/" + Formatter.formatFileSize(context, totalSpace); return stotageInfo; }
八、DeviceInfoUtils 封装类
为了方便查询使用设备信息,小编已经封装成一个
Utils
类。代码如下:package com.programandroid.Utils; import java.util.Locale; import android.R.string; import android.content.Context; import android.telephony.TelephonyManager; import android.util.Log; /* * DeviceInfoUtils.java * * Created on: 2017-11-16 * Author: wangjie * * Welcome attention to weixin public number get more info * * WeiXin Public Number : ProgramAndroid * 微信公众号 :程序员Android * */ public class DeviceInfoUtils { /** * 获取设备宽度(px) * */ public static int getDeviceWidth(Context context) { return context.getResources().getDisplayMetrics().widthPixels; } /** * 获取设备高度(px) */ public static int getDeviceHeight(Context context) { return context.getResources().getDisplayMetrics().heightPixels; } /** * 获取设备的唯一标识, 需要 “android.permission.READ_Phone_STATE”权限 */ public static String getIMEI(Context context) { TelephonyManager tm = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); String deviceId = tm.getDeviceId(); if (deviceId == null) { return "UnKnown"; } else { return deviceId; } } /** * 获取厂商名 * **/ public static String getDeviceManufacturer() { return android.os.Build.MANUFACTURER; } /** * 获取产品名 * **/ public static String getDeviceProduct() { return android.os.Build.PRODUCT; } /** * 获取手机品牌 */ public static String getDeviceBrand() { return android.os.Build.BRAND; } /** * 获取手机型号 */ public static String getDeviceModel() { return android.os.Build.MODEL; } /** * 获取手机主板名 */ public static String getDeviceBoard() { return android.os.Build.BOARD; } /** * 设备名 * **/ public static String getDeviceDevice() { return android.os.Build.DEVICE; } /** * * * fingerprit 信息 * **/ public static String getDeviceFubgerprint() { return android.os.Build.FINGERPRINT; } /** * 硬件名 * * **/ public static String getDeviceHardware() { return android.os.Build.HARDWARE; } /** * 主机 * * **/ public static String getDeviceHost() { return android.os.Build.HOST; } /** * * 显示ID * **/ public static String getDeviceDisplay() { return android.os.Build.DISPLAY; } /** * ID * * **/ public static String getDeviceId() { return android.os.Build.ID; } /** * 获取手机用户名 * * **/ public static String getDeviceUser() { return android.os.Build.USER; } /** * 获取手机 硬件序列号 * **/ public static String getDeviceSerial() { return android.os.Build.SERIAL; } /** * 获取手机Android 系统SDK * * @return */ public static int getDeviceSDK() { return android.os.Build.VERSION.SDK_INT; } /** * 获取手机Android 版本 * * @return */ public static String getDeviceAndroidVersion() { return android.os.Build.VERSION.RELEASE; } /** * 获取当前手机系统语言。 */ public static String getDeviceDefaultLanguage() { return Locale.getDefault().getLanguage(); } /** * 获取当前系统上的语言列表(Locale列表) */ public static String getDeviceSupportLanguage() { Log.e("wangjie", "Local:" + Locale.GERMAN); Log.e("wangjie", "Local:" + Locale.ENGLISH); Log.e("wangjie", "Local:" + Locale.US); Log.e("wangjie", "Local:" + Locale.CHINESE); Log.e("wangjie", "Local:" + Locale.TAIWAN); Log.e("wangjie", "Local:" + Locale.FRANCE); Log.e("wangjie", "Local:" + Locale.FRENCH); Log.e("wangjie", "Local:" + Locale.GERMANY); Log.e("wangjie", "Local:" + Locale.ITALIAN); Log.e("wangjie", "Local:" + Locale.JAPAN); Log.e("wangjie", "Local:" + Locale.JAPANESE); return Locale.getAvailableLocales().toString(); } public static String getDeviceAllInfo(Context context) { return "\n\n1. IMEI:\n\t\t" + getIMEI(context) + "\n\n2. 设备宽度:\n\t\t" + getDeviceWidth(context) + "\n\n3. 设备高度:\n\t\t" + getDeviceHeight(context) + "\n\n4. 是否有内置SD卡:\n\t\t" + SDCardUtils.isSDCardMount() + "\n\n5. RAM 信息:\n\t\t" + SDCardUtils.getRAMInfo(context) + "\n\n6. 内部存储信息\n\t\t" + SDCardUtils.getStorageInfo(context, 0) + "\n\n7. SD卡 信息:\n\t\t" + SDCardUtils.getStorageInfo(context, 1) + "\n\n8. 是否联网:\n\t\t" + Utils.isNetworkConnected(context) + "\n\n9. 网络类型:\n\t\t" + Utils.GetNetworkType(context) + "\n\n10. 系统默认语言:\n\t\t" + getDeviceDefaultLanguage() + "\n\n11. 硬件序列号(设备名):\n\t\t" + android.os.Build.SERIAL + "\n\n12. 手机型号:\n\t\t" + android.os.Build.MODEL + "\n\n13. 生产厂商:\n\t\t" + android.os.Build.MANUFACTURER + "\n\n14. 手机Fingerprint标识:\n\t\t" + android.os.Build.FINGERPRINT + "\n\n15. Android 版本:\n\t\t" + android.os.Build.VERSION.RELEASE + "\n\n16. Android SDK版本:\n\t\t" + android.os.Build.VERSION.SDK_INT + "\n\n17. 安全patch 时间:\n\t\t" + android.os.Build.VERSION.SECURITY_PATCH + "\n\n18. 发布时间:\n\t\t" + Utils.Utc2Local(android.os.Build.TIME) + "\n\n19. 版本类型:\n\t\t" + android.os.Build.TYPE + "\n\n20. 用户名:\n\t\t" + android.os.Build.USER + "\n\n21. 产品名:\n\t\t" + android.os.Build.PRODUCT + "\n\n22. ID:\n\t\t" + android.os.Build.ID + "\n\n23. 显示ID:\n\t\t" + android.os.Build.DISPLAY + "\n\n24. 硬件名:\n\t\t" + android.os.Build.HARDWARE + "\n\n25. 产品名:\n\t\t" + android.os.Build.DEVICE + "\n\n26. Bootloader:\n\t\t" + android.os.Build.BOOTLOADER + "\n\n27. 主板名:\n\t\t" + android.os.Build.BOARD + "\n\n28. CodeName:\n\t\t" + android.os.Build.VERSION.CODENAME + "\n\n29. 语言支持:\n\t\t" + getDeviceSupportLanguage(); } }
九、SDCardUtils 封装类
为了方便查询使用设备信息,小编已经封装成一个
Utils
类。代码如下:package com.programandroid.Utils; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.lang.reflect.Method; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo; import android.content.Context; import android.os.Build; import android.os.Environment; import android.os.StatFs; import android.os.storage.StorageManager; import android.text.TextUtils; import android.text.format.Formatter; /* * SDCardUtils.java * * Created on: 2017-11-22 * Author: wangjie * * Welcome attention to weixin public number get more info * * WeiXin Public Number : ProgramAndroid * 微信公众号 :程序员Android * */ public class SDCardUtils { private static final int INTERNAL_STORAGE = 0; private static final int EXTERNAL_STORAGE = 1; /** * 获取 手机 RAM 信息 * */ public static String getRAMInfo(Context context) { long totalSize = 0; long availableSize = 0; ActivityManager activityManager = (ActivityManager) context .getSystemService(context.ACTIVITY_SERVICE); MemoryInfo memoryInfo = new MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); totalSize = memoryInfo.totalMem; availableSize = memoryInfo.availMem; return "可用/总共:" + Formatter.formatFileSize(context, availableSize) + "/" + Formatter.formatFileSize(context, totalSize); } /** * 判断SD是否挂载 */ public static boolean isSDCardMount() { return Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED); } /** * 获取手机存储 ROM 信息 * * type:用于区分内置存储于外置存储的方法 * * 内置SD卡 :INTERNAL_STORAGE = 0; * * 外置SD卡:EXTERNAL_STORAGE = 1; * **/ public static String getStorageInfo(Context context, int type) { String path = getStoragePath(context, type); /** * 无外置SD 卡判断 * **/ if (isSDCardMount() == false || TextUtils.isEmpty(path) || path == null) { return "无外置SD卡"; } File file = new File(path); StatFs statFs = new StatFs(file.getPath()); String stotageInfo; long blockCount = statFs.getBlockCountLong(); long bloackSize = statFs.getBlockSizeLong(); long totalSpace = bloackSize * blockCount; long availableBlocks = statFs.getAvailableBlocksLong(); long availableSpace = availableBlocks * bloackSize; stotageInfo = "可用/总共:" + Formatter.formatFileSize(context, availableSpace) + "/" + Formatter.formatFileSize(context, totalSpace); return stotageInfo; } /** * 使用反射方法 获取手机存储路径 * * **/ public static String getStoragePath(Context context, int type) { StorageManager sm = (StorageManager) context .getSystemService(Context.STORAGE_SERVICE); try { Method getPathsMethod = sm.getClass().getMethod("getVolumePaths", null); String[] path = (String[]) getPathsMethod.invoke(sm, null); switch (type) { case INTERNAL_STORAGE: return path[type]; case EXTERNAL_STORAGE: if (path.length > 1) { return path[type]; } else { return null; } default: break; } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 获取 手机 RAM 信息 方法 一 * */ public static String getTotalRAM(Context context) { long size = 0; ActivityManager activityManager = (ActivityManager) context .getSystemService(context.ACTIVITY_SERVICE); MemoryInfo outInfo = new MemoryInfo(); activityManager.getMemoryInfo(outInfo); size = outInfo.totalMem; return Formatter.formatFileSize(context, size); } /** * 手机 RAM 信息 方法 二 * */ public static String getTotalRAMOther(Context context) { String path = "/proc/meminfo"; String firstLine = null; int totalRam = 0; try { FileReader fileReader = new FileReader(path); BufferedReader br = new BufferedReader(fileReader, 8192); firstLine = br.readLine().split("\\s+")[1]; br.close(); } catch (Exception e) { e.printStackTrace(); } if (firstLine != null) { totalRam = (int) Math.ceil((new Float(Float.valueOf(firstLine) / (1024 * 1024)).doubleValue())); long totalBytes = 0; } return Formatter.formatFileSize(context, totalRam); } /** * 获取 手机 可用 RAM * */ public static String getAvailableRAM(Context context) { long size = 0; ActivityManager activityManager = (ActivityManager) context .getSystemService(context.ACTIVITY_SERVICE); MemoryInfo outInfo = new MemoryInfo(); activityManager.getMemoryInfo(outInfo); size = outInfo.availMem; return Formatter.formatFileSize(context, size); } /** * 获取手机内部存储空间 * * @param context * @return 以M,G为单位的容量 */ public static String getTotalInternalMemorySize(Context context) { File file = Environment.getDataDirectory(); StatFs statFs = new StatFs(file.getPath()); long blockSizeLong = statFs.getBlockSizeLong(); long blockCountLong = statFs.getBlockCountLong(); long size = blockCountLong * blockSizeLong; return Formatter.formatFileSize(context, size); } /** * 获取手机内部可用存储空间 * * @param context * @return 以M,G为单位的容量 */ public static String getAvailableInternalMemorySize(Context context) { File file = Environment.getDataDirectory(); StatFs statFs = new StatFs(file.getPath()); long availableBlocksLong = statFs.getAvailableBlocksLong(); long blockSizeLong = statFs.getBlockSizeLong(); return Formatter.formatFileSize(context, availableBlocksLong * blockSizeLong); } /** * 获取手机外部存储空间 * * @param context * @return 以M,G为单位的容量 */ public static String getTotalExternalMemorySize(Context context) { File file = Environment.getExternalStorageDirectory(); StatFs statFs = new StatFs(file.getPath()); long blockSizeLong = statFs.getBlockSizeLong(); long blockCountLong = statFs.getBlockCountLong(); return Formatter .formatFileSize(context, blockCountLong * blockSizeLong); } /** * 获取手机外部可用存储空间 * * @param context * @return 以M,G为单位的容量 */ public static String getAvailableExternalMemorySize(Context context) { File file = Environment.getExternalStorageDirectory(); StatFs statFs = new StatFs(file.getPath()); long availableBlocksLong = statFs.getAvailableBlocksLong(); long blockSizeLong = statFs.getBlockSizeLong(); return Formatter.formatFileSize(context, availableBlocksLong * blockSizeLong); } /** * * SD 卡信息 * */ public static String getSDCardInfo() { SDCardInfo sd = new SDCardInfo(); if (!isSDCardMount()) return "SD card 未挂载!"; sd.isExist = true; StatFs sf = new StatFs(Environment.getExternalStorageDirectory() .getPath()); sd.totalBlocks = sf.getBlockCountLong(); sd.blockByteSize = sf.getBlockSizeLong(); sd.availableBlocks = sf.getAvailableBlocksLong(); sd.availableBytes = sf.getAvailableBytes(); sd.freeBlocks = sf.getFreeBlocksLong(); sd.freeBytes = sf.getFreeBytes(); sd.totalBytes = sf.getTotalBytes(); return sd.toString(); } public static class SDCardInfo { boolean isExist; long totalBlocks; long freeBlocks; long availableBlocks; long blockByteSize; long totalBytes; long freeBytes; long availableBytes; @Override public String toString() { return "isExist=" + isExist + "\ntotalBlocks=" + totalBlocks + "\nfreeBlocks=" + freeBlocks + "\navailableBlocks=" + availableBlocks + "\nblockByteSize=" + blockByteSize + "\ntotalBytes=" + totalBytes + "\nfreeBytes=" + freeBytes + "\navailableBytes=" + availableBytes; } } // add start by wangjie for SDCard TotalStorage public static String getSDCardTotalStorage(long totalByte) { double byte2GB = totalByte / 1024.00 / 1024.00 / 1024.00; double totalStorage; if (byte2GB > 1) { totalStorage = Math.ceil(byte2GB); if (totalStorage > 1 && totalStorage < 3) { return 2.0 + "GB"; } else if (totalStorage > 2 && totalStorage < 5) { return 4.0 + "GB"; } else if (totalStorage >= 5 && totalStorage < 10) { return 8.0 + "GB"; } else if (totalStorage >= 10 && totalStorage < 18) { return 16.0 + "GB"; } else if (totalStorage >= 18 && totalStorage < 34) { return 32.0 + "GB"; } else if (totalStorage >= 34 && totalStorage < 50) { return 48.0 + "GB"; } else if (totalStorage >= 50 && totalStorage < 66) { return 64.0 + "GB"; } else if (totalStorage >= 66 && totalStorage < 130) { return 128.0 + "GB"; } } else { // below 1G return get values totalStorage = totalByte / 1024.00 / 1024.00; if (totalStorage >= 515 && totalStorage < 1024) { return 1 + "GB"; } else if (totalStorage >= 260 && totalStorage < 515) { return 512 + "MB"; } else if (totalStorage >= 130 && totalStorage < 260) { return 256 + "MB"; } else if (totalStorage > 70 && totalStorage < 130) { return 128 + "MB"; } else if (totalStorage > 50 && totalStorage < 70) { return 64 + "MB"; } } return totalStorage + "GB"; } // add end by wangjie for SDCard TotalStorage }
至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除。同时感谢您的阅读,期待您的关注。
-
关于Android获取Usb设备权限
2020-11-27 15:54:40关于Android获取Usb设备权限 一、出现权限弹窗:拔插USB设备,弹出权限申请框,通过用户确认或拒绝权限。 二、USB授权方式:(参考google官方文档) minfest中进行权限配置 <manifest ...> ...一、出现权限弹窗:拔插USB设备,弹出权限申请框,通过用户确认或拒绝权限。
二、USB授权方式:(参考google官方文档)
- minfest中进行权限配置
<manifest ...> <uses-feature android:name="android.hardware.usb.host" /> <uses-sdk android:minSdkVersion="12" /> ... <application> <activity ...> ... <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"/> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" /> </activity> </application> </manifest>
-
res/xml/device_filter.xml
配置文件为需要过滤设备的pid以及vid
<?xml version="1.0" encoding="utf-8"?> <resources> <usb-device vendor-id="1234" product-id="5678" class="255" subclass="66" protocol="1" /> </resources>
3.注册广播以及建立广播接收,当监听到USB的插入动作时,通过UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)从 Intent 获取代表所连接设备:
匹配是否为目的usb,使用usbManager.requestPermission(device, permissionIntent)获取权限弹窗,进行授权。
.Java代码示例:
private final String ACTION_USB_PERMISSION = "com.exmple.USB_PERMISSION"; private static final int VID =1234 ; private static final int PID = 5678; private BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action))//是否接收到自定义广播 { synchronized (this) { UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false))//是否授权成功 { if(device != null){ openDevice(); } } else { Log.e("Rechar","device not permission, device info:" + device.toString()); } } } else if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) { UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); assert device != null; if (VID == device.getVendorId() && PID == device.getProductId()) { closeDevice(); openDeviceAndRequestDevice(); } } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); assert device != null; if (VID == device.getVendorId() && PID == device.getProductId()) { closeDevice(); } } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(mUsbReceiver, filter);//注册广播 } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mUsbReceiver); } private void openDeviceAndRequestDevice() { UsbManager usbManager = (UsbManager)this.getSystemService(Context.USB_SERVICE); for (UsbDevice device : usbManager.getDeviceList().values()) { if (device.getVendorId() == VID && device.getProductId() == PID) { Intent intent = new Intent(ACTION_USB_PERMISSION);//发送自定义广播 PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0); usbManager.requestPermission(device, pendingIntent);//弹出权限框,进行权限申请 } } } private void openDevice() { Log.e("Rechar", "openDevice: " ); Toast.makeText(this,"openDevice",Toast.LENGTH_LONG).show(); } private void closeDevice() { Log.e("Rechar", "closeDevice: " ); Toast.makeText(this,"closeDevice",Toast.LENGTH_LONG).show(); } }
4.以上已完成USB的授权。但在开发过程中发现usb-HID并不能弹出权限框,且自动拒绝了权限。分析了系统源码:先判断USB的权限,若没有会return ,再判断camera的权限若没有回return。因此在代码中加入camera的权限后获取到了权限弹框。系统源码如下:
public void requestPermission(UsbDevice device, String packageName, PendingIntent pi, int uid) { Intent intent = new Intent(); // respond immediately if permission has already been granted if (hasPermission(device, packageName, uid)) { intent.putExtra(UsbManager.EXTRA_DEVICE, device); intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, true); try { pi.send(mUserContext, 0, intent); } catch (PendingIntent.CanceledException e) { if (DEBUG) Slog.d(TAG, "requestPermission PendingIntent was cancelled"); } return; } if (isCameraDevicePresent(device)) { if (!isCameraPermissionGranted(packageName, uid)) { intent.putExtra(UsbManager.EXTRA_DEVICE, device); intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false); try { pi.send(mUserContext, 0, intent); } catch (PendingIntent.CanceledException e) { if (DEBUG) Slog.d(TAG, "requestPermission PendingIntent was cancelled"); } return; } } // start UsbPermissionActivity so user can choose an activity intent.putExtra(UsbManager.EXTRA_DEVICE, device); requestPermissionDialog(intent, packageName, pi); }
但是我暂时没有想明白,HID和camera的关系所在,系统代码为何这么写,希望知道的大佬指教一下。谢谢!附上当时参考usb流程解析的网站(usb流程解析),为了防止该网站内容被删除,将该内容附在下面以供参考:
USB请求权限流程
1. 新建activity,获取UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE)
2. 获取所以的USB设备HashMap<String, UsbDevice> map = usbManager.getDeviceList()
3. 过滤别的USB设备,拿到自己USB的USBDevice类,然后请求USB权限,usbManager.requestPermission(usbDevice, pendingIntent);并注册一个回调意图,用来判断用户是否授予权限
4. UsbManager类的requestPermission方法会调用mService. requestDevicePermission
5.mService是IUsbManager的对象,而IUsbManager是一个AIDL接口https://www.androidos.net.cn/android/8.0.0_r4/xref/frameworks/base/core/java/android/hardware/usb/IUsbManager.aidl
UsbService是它的实现类,所以最终是调用的UsbService的requestDevicePermission方法
6. 在requestDevicePermission方法里面调用的getSettingsForUser(userId).requestPermission
7. getSettingsForUser(userId)其实是去获取UsbUserSettingsManager实例,所以是调用的UsbUserSettingsManager的requestPermission方法
8. 在requestPermission方法里面首先会进行判断是否拥有USB权限,如果有就回调广播直接return返回的。如果没有那就判断是否有相机权限,如果没有权限回调广播直接return的。注意从始至终是没有发送用户拒绝的广播的
9. 接着会调用自身的requestPermissionDialog方法,在requestPermissionDialog方法里面又会去调用mUsbPermissionManager.requestPermissionDialog方法
10.最终在UsbPermissionManager类的requestPermissionDialog方法中调用startActivityAsUser 启动UsbPermissionActivity权限申请对话框
11.监听弹出权限对话框的onclick方法,如果点击的授权,那就在UsbPermissionActivity的onDestory里面回调最开始的广播,通知我们的应用,用户授予的权限。
- minfest中进行权限配置
-
安卓获取设备唯一id (无需任何权限,支持自定义id)
2019-12-16 16:20:38安卓,获取设备id 1、添加 DeviceId.jar 至项目libs目录。 2、建议使用自定设备id,用户id信息不易泄露 String id1 = Device.getid(this); // 默认设备id值 String id2 = Device.getid(this, "scimence"); //... -
【React Native】获取设备信息
2018-09-28 15:19:52一、获取方案 使用开源的第三方组件react-native-device-info,该组件适用于iOS和Android双平台。 npm地址:https://www.npmjs.com/package/react-native-device-info 二、组件使用 在ReactNative项目中下载第三... -
Android平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限策略及提示信息,解决uniapp上传华为应用...
2021-05-26 13:01:10一、问题背景最近将app上传至华为应用市场时总是拒绝,其中有一条就是:我们发现您的应用提示获取手机存储敏感权限,用户不同意时强制退出应用,请参考审核指南......, 修改建议:请在用户不统一获取手机存储敏感权... -
Android 10 无法获取USB设备权限异常问题
2021-12-10 14:07:38在小米和VIVO的Android 10的版本上面,利用如下代码无法获取USB设备的权限: private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; private final BroadcastReceiver ... -
微信小程序之位置信息权限获取和设置界面权限显示
2019-03-05 14:17:10小程序提交审核和发布后,多种机型使用起来发现了一个问题,在小程序设置中没有显示具体的权限信息。如下图所示 当考虑到用户使用小程序时,若缺少对应权限,按照官方案例讲的方式是进行自动导航跳转“设置”页面... -
Android动态获取存储权限
2020-05-31 13:06:50Android动态获取存储权限一、前言二、动态获取权限三、举一反三四、参考资料: 一、前言 在开发中用到了SD卡的存储,在AndroidManifest.xml里开启后并不起作用。在执行需要权限的代码时就会出现:IOException: No ... -
H5:获取手机媒体设备权限,如麦克风、视频等
2020-04-01 16:01:54H5开发中,有的项目需要获取手机设备权限,如麦克风、视频。 具体实现 created() { if (navigator.mediaDevices.getUserMedia || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.... -
无法读写文件 open failed: EACCES (Permission denied) 获取设备唯一不变id 所有文件读写权限按钮无法打开
2022-03-23 23:48:41最近有个需求,要获取设备唯一id,Android一直没有什么完善的方案获取设备唯一不变的id,我就结合了几种方案组成了一下: 1. 首先获取IMEI; IMEI获取失败后 2. 获取SN序列号,序列号失败后 3. 随机生成一串UUID... -
Device模块管理设备信息,用于获取手机设备的相关信息,如IMEI、IMSI、型号、厂商等
2022-01-25 15:17:35Device模块管理设备信息 -
JS:浏览器中获取用户手机设备权限,如语音、相机等
2020-03-26 19:33:26H5网页项目中有需要拍照、录音、视频等会需要获取手机设备权限。 具体实现 created() { if (navigator.mediaDevices.getUserMedia || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.... -
Android开发之 permission动态权限获取
2019-08-19 10:57:202、不指定权限则自动获取清单文件上的危险权限进行申请 3、如果动态申请的权限没有在清单文件中注册会抛出异常 4、支持大部分国产手机直接跳转到具体的权限设置页面 5、可设置被拒绝后继续申请,直到用户授权或者... -
kali获取任意设备的位置信息
2022-04-23 21:22:58kali获取位置信息 -
华为手机root权限获取方法
2021-06-05 01:20:40华为手机root权限获取方法华为作为品牌旗舰手机,受到很多用户的喜欢,很多内置软件都不怎么使用。这些内置软件要想删除,只能root权限获取。下面是jy小编整理的一些华为root权限获取教程。欢迎阅读。华为权限获取... -
android获取设备唯一ID方法
2020-07-31 15:46:371、方案一IMEI ... 在Android 8.0(API Level 26)以下,可以通过TelephonyManager的getDeviceId()方法获取到设备的IMEI码(其实这里的说法不准确,该方法是会根据手机设备的制式(GSM或CDMA)返回... -
获取Android 手机设备信息:包括机型、操作系统版本号、手机分辨率、运营商、当前联网方式、IMEI、MEID、...
2019-07-24 17:00:02获取Android 手机设备信息:操作系统版本号、手机分辨率、运营商、当前联网方式、IMEI、MEID、MAC地址 包括双卡机型上的两个IMEI信息 /** * Created by Administrator on 2019/5/15. * 手机详细信息 */ ... -
按键精灵所有者读写权限安卓9.0如何获取?设置
2021-05-26 15:03:28所谓读写者权限说白了就是对系统的读取权限和写入权限,一个软件想要在一个设备要写入某个文件获取读取某个文件,如果没有这个读写者权限是没办法操作的,所以想要继续操作就得获取这个权限才可以。有些人表示自己在... -
Android 获取Wifi列表详解(包含动态权限申请)
2021-09-14 10:11:15对于搭载 Android 10(API 级别 29)及更高版本的设备,系统将针对平台或其他应用在设备上执行的所有完整 WLAN 扫描发送此广播。应用可以使用广播被动监听设备上所有扫描的完成情况,无需发出自己的扫描。 使用 ... -
Chrome 浏览器获取音频设备权限问题 Cannot read property getUserMedia of undefined
2020-06-19 17:06:15谷歌浏览器使用 navigator.mediaDevices.getUserMedia获取资源时报错 monitor.js:296 Uncaught TypeError: Cannot read property 'getUserMedia' of undefined 谷歌浏览器安全权限问题 我们可以通过一下方式解决:... -
Android 获取 usb 权限
2019-10-07 10:23:53文章目录前言:一、直接在AndroidManifest.xml文件中进行如下配置:二、动态代码获取2.1 代码中获取(前提是已经定位到要申请USB权限的usbdevice)2.2 注册广播接受者 前言: 最近工作上遇到几个USB模块在android平台... -
ionic开发——获取手机设备信息
2017-03-31 18:03:042.在platform/android/AndroidManifest.xml中添加权限 在项目中获取的代码如下: device.model :返回设备的模型或产品的名称 device.cordova :返回cordova的版本 device.uuid :返回... -
js获取浏览器摄像头和麦克风权限
2021-02-12 12:38:14前言项目中会使用到摄像头或麦克风设备,这就需要我们获取浏览器的摄像头和麦克风权限,权限是无法通过js操控的,必须由浏览器用户设置。下面我来告诉大家如何获取浏览器的摄像头或麦克风的权限,使浏览器弹出询问... -
android之获取设备唯一标识符
2019-09-02 09:09:402、由于权限变更,刷机,重载安装等,将使得标识符失去唯一性,在此背景下,只能最大程度的由开发者自己根据各种IMEI、Mac adress、SN(设备序列号)等等,再通过不同的加密算法,生成一个极低冲突性的标识符串,然后... -
Android 设备标识获取方案
2022-03-30 22:22:31在APP开发过程中,不可避免...IMEI(International Mobile Equipment Identity number),国际移动设备识别码,与卡槽绑定,双卡设备会有两个,Android 10.0以后Google禁止APP获取该属性。 MEID MEID(Mobile Equipment Id -
获取adb root权限
2018-06-18 12:40:41在开发中,难免在debug release版本时碰倒adb shell权限的问题, 比如QA突然急冲冲的拿着一台出问题的机器跑过来,当你要使用adb shell做一些测试时竟然发现没有 -
如何获取Android设备唯一标识码教程
2020-12-18 20:37:54它是一种互联网身份认证协议,其具有唯一性和信息不可否认性。ID是表示着标签的身份,在JS脚本中会用到id,当JS要修改一个标签的属性时,JS会将id名作为该标签的唯一标识进行操作。也就是说ID只是页面元素的标识,供... -
手机权限设置在哪里_手机设置应用软件权限的具体步骤
2021-06-04 06:12:16会要求读取电话、录音和设备信息等等,这样让APP获取了我们的软件权限后,大家是不是觉得自己的手机都变得不安全了,所以我们有必要在安装软件之后,再对这一些APP进行权限限制,下面我们就来分享一下手机设置应用...