android 6.0 写入SD卡的权限申请实例讲解

作者:Vincent__Lee 时间:2023-07-27 03:12:37 

6.0的手机对于写入手机需要申请权限的

我做了如下处理

下面我贴出代码


package com.example.admin.sdapplication;

import android.Manifest;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;

public class SdkActivity extends AppCompatActivity implements View.OnClickListener{
private Button btn_write;
private Button btn_read;
final int REQUEST_WRITE=1;//申请权限的请求码
@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_sdk);

btn_write= (Button) findViewById(R.id.btn_write);
 btn_read= (Button) findViewById(R.id.btn_read);
 btn_read.setOnClickListener(this);
 btn_write.setOnClickListener(this);
}

private void showAlert(){
 Dialog alertDialog = new AlertDialog.Builder(this).
   setTitle("权限说明").
   setMessage("我们需要这个权限给你提供存储服务").
   setIcon(R.drawable.ic_launcher).
   setPositiveButton("确定", new DialogInterface.OnClickListener() {

@Override
    public void onClick(DialogInterface dialog, int which) {
     // TODO Auto-generated method stub
     //2、申请权限: 参数二:权限的数组;参数三:请求码
     ActivityCompat.requestPermissions(SdkActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_WRITE);
    }
   }).
   setNegativeButton("取消", new DialogInterface.OnClickListener() {

@Override
    public void onClick(DialogInterface dialog, int which) {
     // TODO Auto-generated method stub
    }
   }).
   create();
 alertDialog.show();
}
@Override
public void onClick(View view) {
 switch (view.getId()){
  case R.id.btn_read:
   String s= readToSdCard();
   Log.i("readTosdCard",s);
   break;
  case R.id.btn_write:
   //判断是否6.0以上的手机 不是就不用
   if(Build.VERSION.SDK_INT>=23){
    //判断是否有这个权限
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
     //第一请求权限被取消显示的判断,一般可以不写
     if (ActivityCompat.shouldShowRequestPermissionRationale(SdkActivity.this,
       Manifest.permission.WRITE_EXTERNAL_STORAGE)){
      Log.i("readTosdCard","我们需要这个权限给你提供存储服务");
      showAlert();
     }else {
      //2、申请权限: 参数二:权限的数组;参数三:请求码
      ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_WRITE);
     }
    }else {
     writeToSdCard();
    }
   } else{
    writeToSdCard();
   }
   break;
 }
}

//写数据
public void writeToSdCard(){
 //1、判断sd卡是否可用
 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
  //sd卡可用
  //2、获取sd卡路径
  File sdFile=Environment.getExternalStorageDirectory();
  File path=new File(sdFile,"a.txt");//sd卡下面的a.txt文件 参数 前面 是目录 后面是文件
  try {
   FileOutputStream fileOutputStream=new FileOutputStream(path);
   fileOutputStream.write("hello".getBytes());
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
//读数据
public String readToSdCard(){
 StringBuilder stringBuilder = null;
 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
  File sdFile=Environment.getExternalStorageDirectory();
  File path=new File(sdFile,"a.txt");
  stringBuilder =new StringBuilder();
  try {
   FileInputStream fileInputStream=new FileInputStream(path);
   BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(fileInputStream));

String str;
   while ((str=bufferedReader.readLine())!=null){
    stringBuilder.append(str);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 return stringBuilder.toString();
}
//判断授权的方法 授权成功直接调用写入方法 这是监听的回调
//参数 上下文 授权结果的数组 申请授权的数组
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 if(requestCode==REQUEST_WRITE&&grantResults[0]== PackageManager.PERMISSION_GRANTED){
  writeToSdCard();
 }

}
}

其实就是判断是不是6.0的手机再进行申请权限的处理 利用申请权限的回调机制直接在权限申请下来之后调用写入处理

注释很清楚 你们看看代码就好了( ⊙ o ⊙ )!

另外需要注意的一点我们也处理了第一次用户拒绝权限,第二次需要请求时,给用户提示权限作用


//第一请求权限被取消显示的判断,一般可以不写
if (ActivityCompat.shouldShowRequestPermissionRationale(SdkActivity.this,
 Manifest.permission.WRITE_EXTERNAL_STORAGE)){
Log.i("readTosdCard","我们需要这个权限给你提供存储服务");
showAlert();
}else {
//2、申请权限: 参数二:权限的数组;参数三:请求码
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUEST_WRITE);
}

来源:https://blog.csdn.net/li15225271052/article/details/54657860

标签:android,6.0,SD,权限
0
投稿

猜你喜欢

  • C#获取项目指定目录下文件的方法

    2023-04-19 07:15:26
  • java web学习_浅谈request对象中get和post的差异

    2022-10-28 00:25:20
  • 基于WPF实现简单的文件夹比较工具

    2023-11-15 16:08:34
  • Spring Cloud微服务架构Sentinel数据双向同步

    2021-07-16 04:17:04
  • Java properties 和 yml 的区别解析

    2023-04-01 22:28:09
  • SpringBoot中如何统一接口返回与全局异常处理详解

    2021-08-11 02:22:35
  • Maven入门之使用Nexus搭建Maven私服及上传下载jar包

    2022-05-06 20:47:43
  • C语言实现通讯管理系统设计

    2022-12-29 13:04:50
  • Android Gradle模块依赖替换使用技巧

    2021-07-03 20:22:53
  • Java 深拷贝与浅拷贝的分析

    2023-07-30 14:13:13
  • Java实现的简单网页截屏功能示例

    2021-05-25 13:50:35
  • Android7.0 MTK设置默认桌面

    2023-09-26 12:30:43
  • maven无法依赖spring-cloud-stater-zipkin的解决方案

    2023-09-12 01:54:51
  • JavaWeb项目Servlet无法访问问题解决

    2022-10-10 03:33:52
  • 微信支付H5调用支付详解(java版)

    2023-03-10 14:21:44
  • 面试官:详细谈谈Java对象的4种引用方式

    2022-09-19 04:52:20
  • 手把手教你SpringBoot过滤器N种注册方式

    2023-08-08 08:28:45
  • 深入理解Java设计模式之备忘录模式

    2023-09-20 06:16:43
  • Android入门教程之Fragment的具体使用详解

    2021-09-30 01:21:57
  • 跨域解决方案Jsonp原理解析

    2023-11-07 18:48:05
  • asp之家 软件编程 m.aspxhome.com