Android--权限管理

android 设备实现定时重启(无root权限或已root) 1、在manifest.xml 中添加权限 <uses-permission android:name="android.permission.ACCESS_SUPERUSER" /> 2、新建DeviceAutoRebootService文件,并在manifest.xml 添加service import android.app.Service; import android.content.Intent; import android.os.IBinder; import andr 阅读详情

权限机制

对于6.0以下的权限在安装的时候,根据权限声明产生一个权限列表,用户只有在同意之后才能完成app的安装,造成了我们想要使用某个app,就要忍受其一些不必要的权限。

Android 6.0推出了新的权限机制,我们可以直接安装,当app需要我们授予不恰当的权限的时候,我们可以予以拒绝。当然我们也可以在设置界面对每个app的权限进行查看,以及对单个权限进行授权或者解除授权。

Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等,新的权限机制更好的保护了用户的隐私。

Normal Permission:

ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS

我们可以用 adb 命令查看危险的权限,Dangerous Permission:

adb shell pm list permissions -d -g

Dangerous Permissions:

group:android.permission-group.CONTACTS
  permission:android.permission.WRITE_CONTACTS
  permission:android.permission.GET_ACCOUNTS
  permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
  permission:android.permission.READ_CALL_LOG
  permission:android.permission.READ_PHONE_STATE
  permission:android.permission.CALL_PHONE
  permission:android.permission.WRITE_CALL_LOG
  permission:android.permission.USE_SIP
  permission:android.permission.PROCESS_OUTGOING_CALLS
  permission:com.android.voicemail.permission.ADD_VOICE

group:android.permission-group.CALENDAR
  permission:android.permission.READ_CALENDAR
  permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
  permission:android.permission.CAMERA

group:android.permission-group.SENSORS
  permission:android.permission.BODY_SENSORS

group:android.permission-group.SUPERUSER
  permission:android.permission.ACCESS_SUPERUSER

group:android.permission-group.LOCATION
  permission:android.permission.ACCESS_FINE_LOCATION
  permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
  permission:android.permission.READ_EXTERNAL_STORAGE
  permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
  permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
  permission:android.permission.READ_SMS
  permission:android.permission.RECEIVE_WAP_PUSH
  permission:android.permission.RECEIVE_MMS
  permission:android.permission.RECEIVE_SMS
  permission:android.permission.SEND_SMS
  permission:android.permission.READ_CELL_BROADCASTS

ungrouped:

看到上面的dangerous permissions,我们会发现危险权限都是以组来分的。那么分组会有什么影响。

如果app运行在Android 6.0 或以上的机器上,对于授权机制是这样的。

如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。

此外,对于申请时弹出的dialog上面的文本说明也是对整个权限组的说明,而不是单个权限(这个dialog是不能进行定制的)。

不过需要注意的是,不要对权限组过多的依赖,尽可能对每个危险权限都进行正常流程的申请,因为在后期的版本中这个权限组可能会产生变化。

API处理

新增的 API 有如下几个:

ContextCompat.checkSelfPermission

ActivityCompat.requestPermissions()

onRequestPermissionsResult()

ActivityCompat.shouldShowRequestPermissionRationale

checkSelfPermission 是检查我们是否已申请了某个权限,如果没有申请就调用 requestPermissions() 来进行权限申请。另外因为 ActivityCompat 继承了 ContextCompat,所以我们都用 ActivityCompat 也是可以的。

因为申请权限是个异步的过程,所以我们要在一个回调里去处理结果,就是 onRequestPermissionsResult(),我们在这里拿到用户是否通过了授权,通过就去做通过的处理,失败就做提示处理。

shouldShowRequestPermissionRationale 是告诉用户这个权限是干什么的,只有拒绝授予权限之后再弹出权限框才会出现,你需要给用户一个解释。

使用流程:

  1. 在AndroidManifest文件中添加需要的权限。

    这个步骤和我们之前的开发并没有什么变化,试图去申请一个没有声明的权限可能会导致程序崩溃。

  2. 检查权限

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
          != PackageManager.PERMISSION_GRANTED) {
    }else{
      //
    }

    checkSelfPermission 方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。

  3. 权限申请

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
          != PackageManager.PERMISSION_GRANTED) {
          ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);
    }else{
      //
    }

    该方法是异步的,第一个参数是Context;第二个参数是需要申请的权限的字符串数组;第三个参数为requestCode,主要用于回调的时候检测。可以从方法名requestPermissions以及第二个参数看出,是支持一次性申请多个权限的,系统会通过对话框逐一询问用户是否授权。

  4. 权限申请回调

    @Override
    public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
        switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // 如果请求被拒绝了,这个结果数组是空的
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                // 同意了,做你需要做的与该权限相关的任务。
    
            } else {
    
                //许可拒绝,禁用依赖于此权限的功能。
            }
            return;
        }
    }
    }

    对于权限的申请结果,首先验证 requestCode 定位到我们的申请,然后验证 grantResults 对应于申请的结果,这里的数组对应于申请时的第二个权限字符串数组。如果我们同时申请两个权限,那么 grantResults 的 length 就为2,分别记录我们两个权限的申请结果。如果申请成功,就可以做我们的事情了。

步骤就是这样了,为了用户体验,我们还要把 shouldShowRequestPermissionRationale 向用户解释加进去。

if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // 我们是否应该显示解释
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // 给个解释给用户,不异步阻塞这个线程等待用户的响应!用户看到说明后,再试一次请求权限。

    } else {

        // 不需要解释,我们可以请求许可。

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS 是一个我们定义的int常数。回调方法获取请求的结果,我们可以给它赋值为0为1都可以。
    }
}

封装

虽然权限申请并不复杂,但是重复的代码太多,我们对权限的操作并不是这个我们要开发 app 的要点,如果把它混杂在我们的 MainActivity 里会影响代码的可读性。所以在对权限的操作比较多的时候,我们最好对其进行封装。

原本我们的申请代码是这样的:

if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED)
{

    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.CALL_PHONE},
            MY_PERMISSIONS_REQUEST_CALL_PHONE);
} else
{
    //
}

可以看到不同权限的逻辑是相同的,不同的只是参数。通过上面的代码,我们可以知道需要的是这三个参数:

  • Activity | Fragment
  • permissions(权限字符串数组)
  • requestCode(int型申请码)

所以我们只要写个方法来接收这三个参数即可,所有权限逻辑都相同。通常我们都会把公共的方法都写在一个 BaseActivity 里,然后让我们的 MainActivity 去继承它,在这里我也这样去做。

BaseActivity.java:

public class BaseActivity extends AppCompatActivity {


    protected void isPermissionGranted(String permission, int requestCode) {

        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M){
            return ;
        }

        //判断是否需要请求允许权限
        if (hasPermission(new String[]{permission})) {
            requestPermissions(new String[]{permission}, requestCode);
        }
    }

    protected void isPermissionAllGranted(String[] permissions, int requestCode) {
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M){
            return ;
        }

        //获得批量请求但被禁止的权限列表
        List<String> deniedPerms = new ArrayList<String>();
        for(int i = 0; permissions != null && i < permissions.length;i++){
            if (!hasPermission(new String[]{permissions[i]})) {
                deniedPerms.add(permissions[i]);
            }
        }
        //进行批量请求
        int denyPermNum = deniedPerms.size();
        if(denyPermNum != 0){
            requestPermissions(deniedPerms.toArray(new String[denyPermNum]), requestCode);
        }
    }

    /**
     * 为子类提供一个权限检查方法
     * @param permissions
     * @return
     */
    public boolean hasPermission(String[] permissions) {

        for (String permission: permissions) {
            if (ContextCompat.checkSelfPermission(this, permission)
                    != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    /**
     * 为子类提供一个权限请求方法
     * @param requestCode
     * @param permissions
     */
    public void requestPermission(int requestCode, String[] permissions) {
        ActivityCompat.requestPermissions(this, permissions, requestCode);
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        if(grantResults.length == 0){
            return;
        }

        switch (requestCode) {
            case 1 :
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "未授予拨打电话权限", Toast.LENGTH_SHORT).show();
                }else{
                    doCallPhone();
                }
                break;
            case 2 :
                if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "未授予读取SD卡权限", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(this, "用户已经授予读取SD卡权限", Toast.LENGTH_SHORT).show();
                }
                break;
            case 3 :
                for (int i = 0; i < grantResults.length; i++) {
                    if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                        Toast.makeText(this, "有权限未授予,部分功能不能使用", Toast.LENGTH_SHORT).show();
                        break;
                    } else if (i == grantResults.length - 1){
                        Toast.makeText(this, "用户已经授予全部权限", Toast.LENGTH_SHORT).show();
                    }
                }
                break;
        }

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    private void doCallPhone() {
        Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:" + "10086");
        intent.setData(data);
        startActivity(intent);
    }
}

MainActivity.java:

public class MainActivity extends BaseActivity {

    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        isPermissionAllGranted(new String[]{Manifest.permission.CALL_PHONE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 3);

        mButton = (Button) findViewById(R.id.setting);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //前往应用详情界面
                try {
                    Uri packUri = Uri.parse("package:"+getPackageName());
                    Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,packUri);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                } catch (Exception e) {
                }
            }
        });
    }
}

这里我做了一个小例子,申请了读取SD卡和拨打电话两个权限,可做批量申请,并且回调方法可进入拨号界面,如果 API < 23就不做申请,因为是6.0以下。因为这是举例,我没有创建常量类,拨打电话的 requestCode 是1,SD卡是2,批量是3。代码很简单,稍注意的是在批量申请时有 List 集合记录未申请的权限。

界面上有一个 Button,点击可进入系统的设置,可手动更改权限。

如果是 Fragment,我们只要用getActivity()方法获得 Activity 对象,通过这个对象调用checkSelfPermission相关方法就可以啦。

   public Activity getActivity(Object object) {
        if (object instanceof Activity) {
            return (Activity) object;
        } else if (object instanceof Fragment) {
            return ((Fragment) object).getActivity();
        }
        return null;
    }

结束语:本文仅用来学习记录,参考查阅。

SAP中贸易伙伴的应用原理简析 公司也称为贸易伙伴,是出具合并报表的组织单位,可以为客户和供应商分配公司(贸易伙伴),用于识别集团内关闻公司间的业务往来,在编制合并报表时进行往来账务的计算处理。 如下图某贸易伙伴公司(关联方名称G0059)在我方公司的SAP系统中有多重身份(即是供应商,又是客户)。那么在我方公司SAP系统中建立起公司(贸易伙伴),并关联到供应商和客户主数据中。之后,就可以通过G0059这个贸易伙伴名称来识别与该贸易伙伴间的往来业务。 相应的配置设定如下: 定义公司(贸易伙伴或关联方) 会计凭证中会 阅读详情

相关推荐

从零编写linux0.11 - 第二章 内核初始化

编程环境:Ubuntu Kylin 16.04 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 1.添加内核 进入内核后也不是马上进入main函数,上一章只是暂时设置gdt,此外还要设置idt和其他的一些初始化操作,这些内容也要使用汇编进行编写,此处采用AT&T格式的汇编。 以下为head.s的内容,为了简单起见,内容还是一个死循环。 .globl startup_32 startup_3

皓空Fly的博客 1265

andriod_基础_请求权限(requestPermissions)

转载自: https://www.cnblogs.com/ganchuanpu/p/6798682.html 主要用到的几个方法: //检查权限 int checkSelfPermission(String) //申请权限 void requestPermissions(int, String...) //是否应该显示请求权限的说明 boolean shouldShowRequestPermissionRationale(String) //处理权限结果回调 void onRequestPermissi.

写bug的蚊子的博客 2万+

从数据手册到代码:一步步解读SC7A20寄存器配置与加速度值换算原理

本文详细解析了SC7A20三轴加速度传感器的寄存器配置与加速度值换算原理。从数据手册出发,逐步拆解关键寄存器设置,并推导原始ADC值到物理加速度的完整换算过程,帮助开发者深入理解传感器底层工作原理,提升嵌入式开发效率。

weixin_29179311的博客 368

android开发-动态权限申请

android开发-动态权限申请基础知识权限分类实现方法动态申请权限思路代码总结未用到知识点 android版本6.0后,对于危险权限需要动态申请。本文总结动态申请危险权限的方法。 基础知识 权限分类 1.)普通权限(normal):不直接威胁到用户的隐私,可直接在manifest清单里注册,系统会默认授权。 2)敏感权限:也是危险权限Dangerous-Permisson,能够获取到用户的隐私。需要在manifest清单里注册,同时动态向系统请求授权,每组只要有一个权限申请成功,默认整组权限都可以使用了。

weixin_42498443的博客 3045

瑞萨RA6M5驱动ST7735屏幕避坑指南:从软件SPI到显示汉字与图形的完整流程

本文详细介绍了瑞萨RA6M5单片机驱动ST7735屏幕的完整流程,涵盖硬件连接、软件SPI控制、汉字显示及图形绘制优化等关键步骤。通过避坑指南和实用代码示例,帮助开发者解决屏幕初始化、时序控制、字库移植等常见问题,实现高效稳定的显示效果。

weixin_28705087的博客 275

FANUC机器人RSR与PNS功能深度解析及实战应用指南

本文深度解析了FANUC机器人RSR(远程程序启动)与PNS(程序号选择)两大核心功能。文章详细阐述了RSR的队列执行机制与PNS的二进制编码原理,提供了从硬件连接到参数配置的完整实战指南,并分享了混合使用策略与常见故障排除方法,旨在帮助工程师实现高效、稳定的生产线自动化程序调度。

neovim7hacker的博客 308

Android开发学习日记--运行时动态申请应用权限

方法,即可命令系统自动弹出权限申请窗口,该方法的第一个参数为活动实例,第二个参数为待申请的权限名称数组,第三个参数为本次操作的请求代码。第三步,判断用户的权限选择结果。如果是Android6.0以上才用动态申请权限,也就是下面要讲的。方法,该方法的第一个参数为活动实例,第二个参数为待检查的权限名称。,如果当前页面请求弹出权限申请窗口,那么该页面的Java。这种情况大多出现在刚安装完软件,进入软件的时候。方法,并在该方法内部处理用户的权限选择结果。先写个工具类PermissionUtil。...

m0_52238102的博客 3231

微信小游戏CE修改实战:从入门到精通(附防作弊思路)

本文深入探讨微信小游戏的安全攻防实战,重点分析CE修改、反编译和重打包等安全风险。通过详细的内存修改案例和代码保护方案对比,提供从客户端到服务端的全方位防护策略,帮助开发者构建有效的防作弊体系。

m2n3b4v5c6的博客 1140

Android动态权限总结

return false; } return true; } 申请权限 当未获取权限时,需要向系统请求,请求时使用requestPermissions方法: // ActivityCompat.java // 在Activity中申请权限 public static void requestPermissions(final @NonNull Activity activity, final @NonNull String[] permissions, final @IntRange(from = 0) i

Java364102的博客 1751

嵌入式NuttX RTOS面试题及参考答案

NuttX 的板级支持包(BSP)是一组软件组件,用于将 NuttX 操作系统适配到特定的硬件平台上。BSP 提供了硬件抽象层,使得 NuttX 能够与硬件进行交互,包括初始化硬件设备、提供设备驱动程序等。BSP 的主要作用是隐藏硬件细节,为上层应用程序和操作系统内核提供统一的接口,从而提高软件的可移植性和可维护性。开发 NuttX 的 BSP 通常需要以下步骤:硬件分析:首先需要对目标硬件平台进行详细的分析,了解硬件的架构、处理器类型、外设接口等信息。

大模型大数据攻城狮的专栏 1304

ArcMap|时空地理加权回归(GTWR)

ArcGIS的GTWR插件下载地址:https://www.researchgate.net/publication/329518786_GTWR_ADDIN_Valid_till_Dec_31_2022 更详细的操作参考: https://www.bilibili.com/video/BV1fR4y1M7xB?spm_id_from=333.999.0.0 https://blog.youkuaiyun.com/weixin_40008135/article/details/112693520 双击“GTWR_Be

个人学习笔记 1万+

android 设置应用权限管理,几种安卓权限管理应用介绍

虽说安卓手机root过后,手机应用就可以使用最高权限来实现很多特殊的功能,但随之而来的就是最高的权限导致手机安全与隐私泄露等问题。所以我们并不能让所有应用都可以使用root权限,如果这样我们的手机会变得非常的不安全。我们需要用权限管理软件来管理权限的授权方式,那些应用可以使用root权限,那些应用不允许其使用root权限,只有这样才能保证手机的安全。因此就产生了权限管理这个概念。现在的市面上有很多...

weixin_36253537的博客 3450

【银河麒麟V10】【桌面】【服务器】系统启动问题

1、如果之前运行好好的,重启后系统报错,一般80%是因为fstab的问题,回想下之前有没有添加过外接存储,修改过/etc/fstab,如果是的话一般是因为存储异常(比如网络存储无法连接,本地存储路径变化)导致系统开机自检失败,导致无法正常启动; 处理方式:进入单用户(单用户进入的几种方式上面有专门文章介绍),修改/etc/fstab,将新增的内容暂时注释掉,然后重启系统,能正常进入系统后再分析失败原因。 ...

桂安俊@KylinOS 3万+

Android权限管理

前言农历腊月二十五,年味也愈加浓重了,在新年到来之前争取再多更新几篇博客。此文讲解安卓的权限管理,主要是针对Android 6.0新增加的动态权限获取的使用方法。 两种权限管理什么是权限管理大家也一定都知道,想必不需要笔者多说了,笔者在此只提一下目前的两种权限管理机制: 安装时权限管理: 这是在安卓5.1及以下采用的方案,指的是安装应用完成时,应用可以获得系统权限 运行时权限管理: 安卓6.

吴豪杰 643

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android 权限管理 apk,APK权限管理器安卓版

应用介绍APK权限管理器安卓版是款功能全面,手机管理手机系统,快速搜索你想要的应用,软件操作简单使用功能强大。可以修改一些权限,能修改任何app应用的系统权限,对手机应用进行权限控制,从根本上杜绝恶意软件暗地扣费,获取用户信息等行为。官方简介APK权限修改器是一款权限修改工具,允许您在安装程序之前对其中的敏感权限进行修改(不需要root手机)。如果您对需要自启动,短信,联系人数据等权限的应用不放心...

weixin_33489161的博客 1142

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android中的权限管理机制

Android权限管理机制是保护用户隐私和数据安全的重要机制。通过对应用程序的权限进行管理和控制,可以防止恶意应用程序获取用户的隐私信息,减少对用户隐私的侵犯。同时,权限管理还可以提高应用程序的安全性,防止恶意应用程序对系统进行攻击。在Android应用开发中,开发者应该合理申请和使用权限,遵守Android官方关于权限请求和使用的最佳实践,确保应用程序的合法性和安全性,保护用户的隐私和数据安全。

Good_tea_h的博客 2590

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

探索 Awesome Shizuku:安卓权限管理的新篇章

在Android开发中,处理系统级别的权限一直是一个挑战。而项目为我们提供了一个强大且优雅的解决方案。本文将深入探讨Shizuku的核心特性、技术实现以及它如何改变我们对安卓权限管理的认识。 ## 项目简介 Awesome Shizuku 是一个开源的工具,允许应用在没有root权限的情况下,安全地访问系统服务和API。通过它的桥梁式设计,开发者可以轻松地在普通应用程序中实现原本需要root权

gitblog_00060的博客 1644

几种安卓权限管理应用介绍

虽说安卓手机root过后,手机应用就可以使用最高权限来实现很多特殊的功能,但随之而来的就是最高的权限导致手机安全与隐私泄露等问题。所以我们并不能让所有应用都可以使用root权限,如果这样我们的手机会变得非常的不安全。我们需要用权限管理软件来管理权限的授权方式,那些应用可以使用root权限,那些应用不允许其使用root权限,只有这样才能保证手机的安全。因此就产生了权限管理这个概念。现在的市面上有很多

cnfly8 2061

android 权限管理 第三方框架,如何管理安卓权限:Xposed框架+X隐私模块

如何管理安卓权限:Xposed框架+X隐私模块Xposed框架是一款可以被称之为“神器”的安卓系统类工具,为什么说Xposed神呢?这款App可以说能够让安卓脱胎换骨,它为安卓提供了一个全新的应用平台,用户可以通过安装Xposed模块来实现一些普通安卓App没法做到的事情。举个简单的类比吧,Xposed框架大致就相当于iOS平台上的Cydia,总之如果你爱玩,玩出怎样的花样的可以——自然,Xpos...

weixin_39951930的博客 2267

AppOpsX:您的安卓权限管理专家

在当今的数字时代,隐私和安全问题日益受到关注。AppOpsX 是一款基于 appops 的图形用户界面(GUI)权限管理器,旨在帮助用户轻松控制应用程序的权限,避免权限滥用,从而保护用户的隐私和数据安全。无论您是普通用户还是技术爱好者,AppOpsX 都能为您提供一个直观、高效的权限管理解决方案。 ## 项目技术分析 AppOpsX 的核心技术基于 Android 的 appops 框架,这是...

gitblog_00565的博客 1010

Android 应用权限管理详解

Android 应用权限管理是一个动态演进的系统,结合了静态权限声明、动态权限请求、分区存储模型、背景权限控制、SELinux 强制访问控制和沙箱隔离等多层次机制。结束语Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

江上清风山间明月的博客 5467

Android权限管理及动态申请权限

Android权限管理 一、基本介绍   Android安全架构规定:默认情况下,任何应用都没有权限执行对其他应用、操作系统或用户有不利影响的任何操作。这包括读写用户的私有数据(如联系人或电子邮件等)、读写其他应用的文件、执行网络访问、使设备保持唤醒状态等等。   应用权限基于系统安全功能,并有助于 Android 支持与用户隐私相关的以下目标: 控制:用户可以控制他们与应用分享的数据。 透明度:用户可以了解应用使用了哪些数据以及应用为何访问相关数据。 数据最小化:应用仅能访问和使用用户调用的特定任务.

weixin_56291477的博客 3万+

android 权限管理 apk,android权限管理

当android6.0还没普及的时候,我们对6.0权限兼容性问题很少引起重视。然而MIUI系大部分都升级到6.0以上的时候,我们的apk里权限问题爆发了,具体表现在读取本地相册、拍照程序会崩溃。这也给咱提个醒,对于新发布的android版本,要提前做好兼容性测试。那么本文就带大家了解下安卓权限演变的路程以及如何去应对1. android 两种权限管理方式0x01:全家桶android 6.0以前,...

weixin_33355385的博客 1081

安卓系统权限管理演绎史:从“街道自由”到“数字警卫”

如果说权限管理是数字世界的警卫盾牌,那么安卓这十年,就是不断磨练、智慧进化、全民协作的旅程。从“草莽混战”到“分权自治”,从“被动防护”到“主动自救”,安卓的权限演绎史,是一部隐私保护、体验升级、科技安全的璀璨画卷。在这条路上,每个人,都是自己的网络安全官,也是数字城邦的有力守护者。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 691

AppOpsX:安卓权限管理的终极解决方案,轻松掌控应用权限

AppOpsX是一款专为安卓系统设计的权限管理前端应用,能够让你全面掌控手机应用的各种权限。通过这款强大的工具,你可以限制应用的权限滥用,保护个人隐私安全,提升手机使用体验。😊 ## 🔍 为什么需要AppOpsX权限管理工具? 在安卓生态系统中,很多应用会过度申请权限,比如读取联系人、获取位置信息、访问摄像头等。AppOpsX提供了一种简单有效的方法来管理这些权限,让你真正成为手机的主人。

gitblog_00395的博客 643

KernelSU安卓Root方案:从内核层面重新定义Android权限管理

你是否曾因Android设备的Root权限管理复杂而苦恼?传统Root方案要么功能单一,要么安全风险高,而KernelSU的出现彻底改变了这一现状。作为一款基于内核的Android Root解决方案,KernelSU不仅提供了强大的权限管理能力,还通过创新的模块化架构和WebUI界面,让系统管理变得前所未有的简单和安全。 ## 三大核心优势:为什么选择KernelSU? ### 内核级权限控制

gitblog_00107的博客 908
上一篇: Android--SQLite数据库分页
下一篇: Android--权限列表
因人而异
博客等级 码龄10年 46粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值