android 6.0 写sd卡权限问题

ljx2010hxj 2016-10-31 10:42:01
android 6.0,我在应用里面,执行从sd卡一个目录复制文件到另外一个目录,报权限问题,参考这位大神的文章:
http://blog.csdn.net/zzw941124/article/details/51262650 发现问题还是存在的。按照文章中的方法,打印出来的权限请求值为0,也就是说,权限是ok的,但是在复制粘贴的时候,还是报同样的错误,有哪位大神遇到过这样的问题,请不吝赐教。
...全文
749 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
低调滴开发 2017-07-13
  • 打赏
  • 举报
回复
动态申请权限,再代码中申请权限不是清单文件
ao929929fei 2017-07-12
  • 打赏
  • 举报
回复
Android 6.0对权限进行了管理了,需要动态申请权限,申请的时候会弹出权限授权框让用户选择的 具体可以参照Android 6.0自带音乐播放器来做
yiyi_123_ 2017-07-11
  • 打赏
  • 举报
回复
遇到同样的问题,你解决了么? 我发现WRITE_EXTERNAL_STORAGE这个权限是对手机自带的存储卡的。三星c7上测试的。 我感觉,安卓6.0的动态权限申请完了后,就是安卓4.4的在AndroidManifest.xml内添加权限一样,同样没有对外置TF卡写的权限。 本人在安卓端是小白,有错误请指出。 不过ES和RE都可以对外置TF卡操作时,弹出操作授权框,然后选路径后,就可以对整个TF卡操作。不知道怎么实现的。 我感觉这才是真正的权限的解决方案。。
「已注销」 2017-05-03
  • 打赏
  • 举报
回复
你好,这个问题解决了吗,我也遇到同样的问题
qq_35406212 2016-11-10
  • 打赏
  • 举报
回复
试试 把 TargetSDK 调低到22或者21 ?我就这么解决了
Alan_Mo 2016-11-10
  • 打赏
  • 举报
回复
外置SD卡要用<permission name="android.permission.WRITE_MEDIA_STORAGE" > </permission> 这个吧
Alan_Mo 2016-11-10
  • 打赏
  • 举报
回复
<permission name="android.permission.WRITE_MEDIA_STORAGE" > </permission> 试试加这个权限
ljx2010hxj 2016-11-03
  • 打赏
  • 举报
回复
没人回答啊,还在找寻中,等我找到方法,再来回复此贴吧。
小钙 2016-10-31
  • 打赏
  • 举报
回复
首先:
你的 App 没有用到运行时权限的特性,因为 targetSdkVersion 是 20。
也就是说 targeSdkVersion = 23 的时候才需要在运行的时候动态申请权限。当然,前提是你的版本也要是 6.0

6.0 以下的话,只要在 Manifest 下面声明了权限系统就会给这些权限了。

请问你用的 IDE 是什么,手机的版本是多少?
ink_s 2016-10-31
  • 打赏
  • 举报
回复
设置》应用程序 或者权限管理 里面你给他权限了吗?
ljx2010hxj 2016-10-31
  • 打赏
  • 举报
回复
引用 1 楼 zhangqinghuazhangzhe 的回复:
Manifest 里面你申请了哪些权限
读写权限都申请了。 <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="20" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
小钙 2016-10-31
  • 打赏
  • 举报
回复
Manifest 里面你申请了哪些权限
ljx2010hxj 2016-10-31
  • 打赏
  • 举报
回复
代码: public class MainActivity extends Activity { TextView tv; public static final String fromPath = "/storage/emulated/0/456/"; public static final String toPath = "/storage/44EF-6209/DCIM/Camera/"; //public static final String toPath = "/storage/emulated/0/11/"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); verifyStoragePermissions(this); tv = (TextView)findViewById(R.id.hello); tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d("ljx", "onclick"); if(copy(fromPath, toPath) == 0){ Toast.makeText(MainActivity.this, "copy ok", Toast.LENGTH_LONG).show(); tv.setText("ok"); } } }); } public int copy(String fromFile, String toFile){ File[] currentFiles; File root = new File(fromFile); currentFiles = root.listFiles(); String path = Environment.getExternalStorageDirectory() +File.separator +"install"; Log.d("ljx", "path="+path); File ok = new File(path); if(!ok.exists()){ ok.mkdir(); } if(currentFiles == null){ Toast.makeText(this, "failed", Toast.LENGTH_LONG).show(); return -1; } for(int i = 0; i < currentFiles.length; i++){ Log.d("ljx", "file path="+currentFiles[i].getPath()); Log.d("ljx", "dest="+toFile+currentFiles[i].getName()); //copyFile(currentFiles[i].getPath(), path+File.separator+currentFiles[i].getName()); copyFile(currentFiles[i].getPath(), toFile+currentFiles[i].getName()); } tv.setText("ok"); return -1; } public int copyFile(String fromFile, String toFile){ Log.d("ljx", "fromFile="+fromFile + " toFile="+toFile); try { FileInputStream fosfrom = new FileInputStream(fromFile); FileOutputStream fosto = new FileOutputStream(toFile); byte bt[] = new byte[512*1024]; int c; while ((c = fosfrom.read(bt)) > 0) { fosto.write(bt, 0, c); } fosfrom.close(); fosto.close(); return 0; } catch(FileNotFoundException e){ e.printStackTrace(); Log.d("ljx", "file not found"); return -1; }catch(IOException e){ e.printStackTrace(); Log.d("ljx", "IOException"); return -1; } catch (Exception ex) { ex.printStackTrace(); return -1; } } // Storage Permissions private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; /** * Checks if the app has permission to write to device storage * * If the app does not has permission then the user will be prompted to * grant permissions * * @param activity */ public static void verifyStoragePermissions(Activity activity) { int readPer = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); Log.d("ljx", "readPer="+readPer); if (readPer != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } // Check if we have write permission int permission = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); Log.d("ljx", "permission="+permission); if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } } } Androidmanest文件 <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="23" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
ljx2010hxj 2016-10-31
  • 打赏
  • 举报
回复
引用 7 楼 zhangqinghuazhangzhe 的回复:
你把异常信息跟错误的代码发出来看看吧
W System.err: java.io.FileNotFoundException: /storage/44EF-6209/DCIM/Camera/hah.3gp: open failed: EACCES (Permission denied) 10-31 13:22:13.080775 3465 4501 W System.err: at libcore.io.IoBridge.open(IoBridge.java:487) 10-31 13:22:13.080817 3465 4501 W System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:87) 10-31 13:22:13.080841 3465 4501 W System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:127) 10-31 13:22:13.080879 3465 4501 W System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:116) 10-31 13:22:13.080905 3465 4501 W System.err: at com.protruly.gallery3d.app.video.BQLMovieUtil.copyVideoFile(BQLMovieUtil.java:305) 10-31 13:22:13.080958 3465 4501 W System.err: at com.protruly.gallery3d.app.video.BQLMovieActivity$CopyVideoTask.doInBackground(BQLMovieActivity.java:876) 10-31 13:22:13.080990 3465 4501 W System.err: at com.protruly.gallery3d.app.video.BQLMovieActivity$CopyVideoTask.doInBackground(BQLMovieActivity.java:1) 10-31 13:22:13.081012 3465 4501 W System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295) 10-31 13:22:13.081081 3465 4501 W System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237) 10-31 13:22:13.081123 3465 4501 W System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 10-31 13:22:13.081156 3465 4501 W System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 10-31 13:22:13.081187 3465 4501 W System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 10-31 13:22:13.081215 3465 4501 W System.err: at java.lang.Thread.run(Thread.java:818) 10-31 13:22:13.081277 3465 4501 W System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 10-31 13:22:13.081340 1170 1481 D PerfServiceManager: [PerfService] MESSAGE_TIMEOUT:103 10-31 13:22:13.081442 3465 4501 W System.err: at libcore.io.Posix.open(Native Method) 10-31 13:22:13.081476 3465 4501 W System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 10-31 13:22:13.081507 3465 4501 W System.err: at libcore.io.IoBridge.open(IoBridge.java:473) 10-31 13:22:13.081529 3465 4501 W System.err: ... 12 more
小钙 2016-10-31
  • 打赏
  • 举报
回复
你把异常信息跟错误的代码发出来看看吧
ljx2010hxj 2016-10-31
  • 打赏
  • 举报
回复
引用 3 楼 ink_s 的回复:
设置》应用程序 或者权限管理 里面你给他权限了吗?
权限都是打开的了,已经赋给了。
ljx2010hxj 2016-10-31
  • 打赏
  • 举报
回复
引用 4 楼 zhangqinghuazhangzhe 的回复:
首先: 你的 App 没有用到运行时权限的特性,因为 targetSdkVersion 是 20。 也就是说 targeSdkVersion = 23 的时候才需要在运行的时候动态申请权限。当然,前提是你的版本也要是 6.0 6.0 以下的话,只要在 Manifest 下面声明了权限系统就会给这些权限了。 请问你用的 IDE 是什么,手机的版本是多少?
使用的eclipse,手机android系统是6.0的。我修改成23,还是不行

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧