android6.0的写入SD卡的权限申请

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);
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值