精华内容
下载资源
问答
  • 在Android 6.0之后新增了动态权限,比如获取IMEI,写入外置存储的时候需要添加动态权限。关于动态权限参考文章。我们在添加动态权限的时候都需要回调Activity里面的onRequestPermissionsResult(int requestCode,...

    在Android 6.0之后新增了动态权限,比如获取IMEI,写入外置存储卡的时候需要添加动态权限。关于动态权限参考文章

    我们在添加动态权限的时候都需要回调Activity里面的

    onRequestPermissionsResult(int requestCode,String[] permissions, int[] paramArrayOfInt)方法。

    但是如果我们写的是SDK插件。我们就需要去要求接入sdk的开发者去申请获取IMEI或者读写外置存储卡的时候需要添加动态权限了。

    开发者如果不添加动态权限或者用户决绝了该权限就无法使用写入内存卡的数据或者获取IMEI了。

    那么Android 6.0以及之后的版本我们该如何处理这个问题呢???

    一,获取读写存储卡的的权限

    地址获取方式为:String path = mContext.getFilesDir().getAbsolutePath();

    使用该地址为/storage/emulated/0/fly/apk/8c7e1f8e966ea23c27daead5298b38c1.apk写入apk文件的时候在

    Android 6.0之后出现以下异常。


    解决的方式就是修改读写文件的地址: mContext.getExternalCacheDir().getPath() + "/myFilePath/";就可以了。这个存储地址为SDCard/Android/data/你的应用包名/cache/myFilePath下面。这样就不需要添加动态权限也可以读写储存卡了。这样不仅不需要动态权限甚至都不用在AndroidManifest里面添加WRITE_EXTERNAL_STORAGE.这个权限都可以。

    但是这个也有一些缺点。这个 mContext.getExternalCacheDir().getPath()方式获取的存储地址的数据容易被用户清理掉。当用户清理掉的时候需要从新下载写入了。


    二,获取IMEI时需要动态的READ_PHONE_STATE的权限:

    很多SDK插件都需要获取手机的IMEI。在6.0之前的系统只要在AndroidManifest里面添加了

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />就行了。

    但是6.0以及之后的系统版本需要动态获取动态权限READ_PHONE_STATE才行。

    以下为参考方案:

    private String getImei() {
        String imei = null;
        TelephonyManager tm = (TelephonyManager) mycontext.getSystemService(mycontext.TELEPHONY_SERVICE);
        try {
            imei = tm.getDeviceId();
            if (imei == null) {// android pad
                imei = Secure.getString(mycontext.getContentResolver(), Secure.ANDROID_ID);// 平板电脑 Pad获取的imei
            }
        } catch (Exception e) {
            //当targetSdkVersion >22 也就是Android 5.1以上的版本时
            imei = SharedUtile.getInstance(mycontext).getString(DataStatc.IMEIKey, "");
            if ("".equals(imei)) {
                UUID uuid = UUID.randomUUID();
                SharedUtile.getInstance(mycontext).setString(DataStatc.IMEIKey, "No_" + uuid.toString());
                imei = SharedUtile.getInstance(mycontext).getString(DataStatc.IMEIKey, "");
               Log.e( "tag", "UUID=" + SharedUtile.getInstance(mycontext).getString(DataStatc.IMEIKey, ""));
            }
        }
        return imei;
    }

    三,最后:

          以上的方案解决的是:在用户需要获取IMEI和读写内存卡权限的时并且又不能添加动态权限的情况。这种需求主要是在写SDK的时候。

          如果读者有更好的实现方式满足以上需求欢迎评论交流。



    展开全文
  • Android6.0动态申请SD卡读写权限

    千次阅读 2018-07-06 18:02:28
    有些设备不能在本地写文件的解决方法如下 : Android6.0之后系统对权限的管理更加严格了,不但要在...下面是动态申请SD卡读写权限 在AndroidManifest中添加SD卡读写权限 &lt;uses-permission...

    有些设备不能在本地写文件的解决方法如下 :

    Android6.0之后系统对权限的管理更加严格了,不但要在AndroidManifest中添加,还要在应用运行的时候动态申请。下面是动态申请SD卡读写的权限

    1. 在AndroidManifest中添加SD卡读写的权限
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
       
    • 1
    • 2
    1. 动态申请权限
     private static final int REQUEST_EXTERNAL_STORAGE = 1;
        private static String[] PERMISSIONS_STORAGE = {
                "android.permission.READ_EXTERNAL_STORAGE",
                "android.permission.WRITE_EXTERNAL_STORAGE" };
    
    
        public static void verifyStoragePermissions(Activity activity) {
    
            try {
            //检测是否有写的权限
                int permission = ActivityCompat.checkSelfPermission(activity,
                        "android.permission.WRITE_EXTERNAL_STORAGE");
                if (permission != PackageManager.PERMISSION_GRANTED) {
            // 没有写的权限,去申请写的权限,会弹出对话框
                    ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    把verifyStoragePermissions方法放在onCreate方法中即可。

    展开全文
  • Android 10 中读写SD卡权限的问题

    万次阅读 多人点赞 2020-04-24 21:57:24
    记一次在android的学习中遇到的SD卡权限问题。最开始题主本来是想做一个小的demo来操作SD卡。如图所示: 没想到在开发的过程中遇到了权限问题。 首先贴一下activity的代码。其实就是三个按钮,绑定三个事件。 ...

    记一次在android的学习中遇到的SD卡权限问题。最开始题主本来是想做一个小的demo来操作SD卡。如图所示:
    在这里插入图片描述
    没想到在开发的过程中遇到了权限问题。
    首先贴一下activity的代码。其实就是三个按钮,绑定三个事件。

    package com.example.demo;
    
    import android.Manifest;
    import android.app.Activity;
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.ActivityCompat;
    
    import java.io.IOException;
    
    /**
     * @Author godv
     * Date on 2020/4/14  22:02
     */
    public class FileActivity extends AppCompatActivity {
        private EditText editname;
        private EditText editdetail;
        private Button btnsave;
        private Button btnclean;
        private Button btnread;
        private Context mContext;
    
        private static final int REQUEST_EXTERNAL_STORAGE = 1;
        private static String[] PERMISSIONS_STORAGE = {
                "android.permission.READ_EXTERNAL_STORAGE",
                "android.permission.WRITE_EXTERNAL_STORAGE" };
        /*
         * android 动态权限申请
         * */
        public static void verifyStoragePermissions(Activity activity) {
            try {
                //检测是否有写的权限
                int permission = ActivityCompat.checkSelfPermission(activity,
                        "android.permission.WRITE_EXTERNAL_STORAGE");
                if (permission != PackageManager.PERMISSION_GRANTED) {
                    // 没有写的权限,去申请写的权限,会弹出对话框
                    ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
    
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.file_layout);
            verifyStoragePermissions(this);
    
            mContext = getApplication();
            editdetail = (EditText) findViewById(R.id.editdetail);
            editname = (EditText) findViewById(R.id.editname);
            btnclean = (Button) findViewById(R.id.btnclean);
            btnsave = (Button) findViewById(R.id.btnsave);
            btnread = (Button) findViewById(R.id.btnread);
            //清空
            btnclean.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    editdetail.setText("");
                    editname.setText("");
                }
            });
            //保存
            btnsave.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    FileHelper fHelper = new FileHelper(mContext);
                    String filename = editname.getText().toString();
                    String filedetail = editdetail.getText().toString();
                    try {
                        fHelper.savFileToSD(filename, filedetail);
                        Toast.makeText(getApplicationContext(), "数据写入成功", Toast.LENGTH_SHORT).show();
                    } catch (Exception e) {
                        e.printStackTrace();
                        Toast.makeText(getApplicationContext(), "数据写入失败", Toast.LENGTH_SHORT).show();
                    }
                }
            });
            btnread.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String detail = "";
                    FileHelper fHelper2 = new FileHelper(getApplicationContext());
                    String fname = editname.getText().toString();
                    try {
                        detail = fHelper2.readFromSD(fname);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    Toast.makeText(getApplicationContext(), detail, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
    
    

    其中FileHelper的代码如下:

    package com.example.demo;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.os.Environment;
    import android.widget.Toast;
    
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * @Author godv
     * Date on 2020/4/14  22:13
     */
    public class FileHelper {
    
        private Context mContext;
    
        public FileHelper() {
        }
    
        public FileHelper(Context mContext) {
            super();
            this.mContext = mContext;
        }
    
    
        /**
         * @param filename
         * @param fileContent
         * @throws Exception
         */
        public void savFileToSD(String filename, String fileContent) throws Exception {
            //如果手机已插入sd卡,且app具有读写sd卡的权限
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
                File file=new File(filename);
                FileOutputStream output = new FileOutputStream(file);
                 output.write(fileContent.getBytes());
                //将String字符串以字节流的形式写入到输出流中
                output.close();
                //关闭输出流
            } else{
                Toast.makeText(mContext, "SD卡不存在或者不可读写", Toast.LENGTH_SHORT).show();
            }
        }
    
        //读取SD卡中文件的方法
        //定义读取文件的方法:
        public String readFromSD(String filename) throws IOException {
            StringBuilder sb = new StringBuilder("");
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                filename = Environment.getExternalStorageDirectory().getCanonicalPath() + "/" + filename;
                //打开文件输入流
                File file=new File(filename);
                FileInputStream input = new FileInputStream(file);
                byte[] temp = new byte[1024];
    
                int len = 0;
                //读取文件内容:
                while ((len = input.read(temp)) > 0) {
                    sb.append(new String(temp, 0, len));
                }
                //关闭输入流
                input.close();
            }
            return sb.toString();
        }
    
    }
    
    

    但是在android 6+后操作SD卡有动态权限问题。我们需要在Android中添加动态权限 也就是上述activity中的verifyStoragePermissions方法。当然在Androidmanifast中配置也是必不可少的。

    <!--    sd读写权限-->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    但是问题还是没有解决。在我们获取操作流的时候。
    FileOutputStream output = new FileOutputStream(file);
    还是会出现报错。
    出现报错的原因是由于android 10中文件读写新特性。还需要在Androidmanifast的application节点中加入android:requestLegacyExternalStorage=“true”。最后问题得到解决。
    参考文档:
    适配策略
    解决方案

    展开全文
  • 一般来说,android开发要获取手机权限的时候只需要在AndroidManifest.xml中添加权限代码即可,例如" 但是 ,对于华为手机 一招就不行了, 我这边需要一个小功能,就是拍照 上传图片到服务器,然后在其他...
    一般来说,android开发要获取手机权限的时候只需要在AndroidManifest.xml中添加权限代码即可,例如"
    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.FLASHLIGHT" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-feature android:name="android.hardware.camera" />
        <uses-feature android:name="android.hardware.camera.autofocus" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />


    但是 ,对于华为手机 一招就不行了, 我这边需要一个小功能,就是拍照 上传图片到服务器,然后在其他界面进行显示, 拍照的代码就不帖了,只是这个在上传图片的时候就会提示上传失败,提示原因:" open failed: EACCES (Permission denied)" 什么意思呢,就是打开失败权限被拒绝,最好找了半天,华为这个系统读取SD卡需要在你请求哪个类中把这个权限直接用java代码来添加 不多说了 直接贴代码记录下

    定义变量

        private static final int REQUEST_EXTERNAL_STORAGE = 1;
        private static String[] PERMISSIONS_STORAGE = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };
    在onCreate方法下面添加下列代码即可

            int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (permission != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(
                        this,
                        PERMISSIONS_STORAGE,
                        REQUEST_EXTERNAL_STORAGE
                );
            }

    亲测有用 记录一下


    展开全文
  • Android读写sd卡权限问题动态添加权限:”https://www.jianshu.com/p/d349047e6515 添加权限: <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission ...
  • 对U盘和内存卡进行加密时,您可以根据需要对U盘和内存卡里面的文件设置不同的使用权限,如完全权限、只读权限读写权限或者是自定义权限,十一种权限设置任您自由搭配,灵活性强。此外,您还可以限制使用次数和使用...
  • Android6以后第三方APP获取读写外部SD卡权限的方法

    万次阅读 热门讨论 2018-05-26 12:23:17
    android6以前,想让第三方APP获的读写外部SD权限,只要修改 frameworks/base/data/etc/platform.xml 将  &lt;permission name="android.permission.WRITE_EXTERNAL_STORAGE" &gt;  &lt;...
  • android系统读取sd卡权限奇葩问题

    千次阅读 2018-12-28 04:05:39
    android6.0读取sd文件问题 if (Build.VERSION.SDK_INT &gt;= 23) { if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager....
  • Android6 0 读写SD卡权限动态申请

    千次阅读 2018-11-11 07:59:31
    Android6 0 读写SD卡权限动态申请
  • //跳转到下一个页面,下一个页面需要读写SD卡权限,就可以调用该方法 position = 0; break; case R.id.rb_audio: position = 1; break; case R.id.rb_net_video: position = 2; break; case R.id.rb_...
  • AndroidQ的SD卡读取权限问题解决方法

    千次阅读 2020-04-20 19:21:22
    AndroidQ的SD卡读取权限问题解决方法 在学Android中,前面的学习都没有什么问题,一遇到权限问题就蒙了,网上找了好久的,说是Android6.0以上要动态获取权限,我尝试了但是对我项目没有用。 于是我又找又找,终于...
  • 对U盘和内存卡进行加密时,您可以根据需要对U盘和内存卡里面的文件设置不同的使用权限,如完全权限、只读权限读写权限或者是自定义权限,十一种权限设置任您自由搭配,灵活性强。此外,您还可以限制使用次数和使用...
  • 今天小编就为大家分享一篇Android内部存储改变读取权限的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Android6.0 读写SD卡权限动态申请

    万次阅读 2017-01-03 18:47:59
    安卓6.0以上,进行了权限管理 不止要在AndroidManifest.xml里面添加权限   还要在JAVA代码中运行时实时请求权限: // Storage Permissions private static final int REQUEST_EXTERNAL_STORAGE = 1;
  • android检测SD卡读写权限详情

    千次阅读 2016-11-16 18:12:47
    做项目遇到了一个棘手的问题,SD读写权限问题。1.android版本在6.0以上版本时,以下代码才有用:if (Build.VERSION.SDK_INT >= 23) { UiUtils.getInstance().showToast("1"); //减少是否拥有权限...
  • android6.0获取sd卡读写权限

    千次阅读 2017-12-29 10:11:39
    android6.0以上获取SD卡读写权限方法:打开搭载6.0以上版本的android手机,设置—找到该应用—权限—-选中读写SD权限
  • 该资源功能亮点是可以对4.0以上的外置sd进行读写操作,同时附上获取外置sd路径的代码。
  • U盘内存卡批量只读加密专家适用于销售多媒体设备、加密U盘和加密内存卡的商家、想快速把普通U盘和内存卡变成加密U盘和内存卡的企业、商家和个人,同时也适用于想对自己在U盘和内存卡上数据进行使用权限控制的用户。...
  • https://blog.csdn.net/qq_27531813/article/details/90369020
  • 上一篇《【Android】读取sdcard上的所有图片并且显示,读取的过程有进度条显示》(点击打开链接)在真机上测试很有问题,经常遇到内存溢出,卡死的情况。因为现在真机上的内存上,2G已经很少见了,基本上都8G的...
  • 内存卡本身具有坚固、抗冲击等外部特性和读写快、空间大等内部特性,但是内存卡因为每天都要读写大量数据很容易从内部发生损坏。内存卡发生损坏时想必大家最担心的就是卡里的数据会不会丢失了,那么内存卡损坏的话...
  • android.os下的StatFs类主要用来获取文件系统的状态,能够获取sd的大小和剩余空间,例如通过实例化一个StatFs对象 new StatFs(path.getPath())把SD卡根目录路径传进去可以获取SD卡根目录下的内存存储状态。
  • sd和手机内存读写权限

    千次阅读 2015-03-03 16:25:29
    sd卡的读写权限 内存卡读写权限
  • Android6.0以上读写入sd卡权限

    千次阅读 2018-03-29 15:51:37
    如图所示,在mainfest文件中声明了SD的读和写权限,仍旧报错:&lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"&gt;&lt;/uses-permission&gt; &lt;...
  • SD的写入权限问题

    千次阅读 2017-04-17 21:19:14
    Android 6.0以后Google提高了Android的安全性,我们对SD的操作也不能像以前一样只要在manifest文件中声明<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />就可以了...
  • 关于sd读取权限

    千次阅读 2015-08-31 11:07:23
    外部存储可以通过物理介质提供(如SD),也可以通过将内部存储中的一部分封装而成,设备可以有多个外部存储实例。 访问外部存储的权限  从Android 1.0开始,写操作受权限WRITE_EXTERNAL_STORAGE保护。  从Android...
  • 高速传输反射内存卡

    千次阅读 2019-06-30 10:50:08
    每个节点都有写入数据访问和读取本地内存权限。当数据写入本地内存,FPGA 捕获并发送数据到实时反射内存中网络下数据写入本地内存并送到下一节点,数据写入本地内存并送到下一节点,直到数据回到源发送的节点才将...
  • 获取SD卡权限

    2019-03-09 02:30:52
    一、解析 做项目遇到了一个棘手的问题,SD读写权限问题。 1.android版本在6.0以上版本时,以下代码才有用: if (Build.VERSION.SDK_INT >= 23) { UiUtils.getInstance().showToast(“1”); //...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,857
精华内容 21,542
关键字:

如何给软件读取内存卡权限