【问题标题】:Android External storage handle unavailabilityAndroid外部存储句柄不可用
【发布时间】:2016-08-15 16:43:21
【问题描述】:

在我的应用中,用户可以将屏幕截图和文件保存在他的外部存储中。但是当外部存储不可写时我该怎么办?将我的设备从棒棒糖更新为棉花糖时,我遇到了这个问题。当我尝试保存屏幕截图时,我的应用程序无法识别 SD 卡。但它可以通过 ES Filex Explorer 访问,但只读!不应该在每个设备上保留一部分内部存储作为“外部”存储吗?为什么这不起作用?

附注当外部存储可写时,代码运行良好!

这是我的代码:

 Bitmap bitmap = getScreenshotFromRecyclerView(recyclerView);
        File file = storeImage(bitmap, name);
        if(file != null){
            Toast.makeText(this, getString(R.string.screenshotSaved, name), Toast.LENGTH_LONG).show();
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.parse(file.toURI().toString()), "image/*");
            startActivity(intent);
        }else{
            Toast.makeText(this, getString(R.string.notAvailable), Toast.LENGTH_LONG).show();
        }



     private File storeImage(Bitmap image, String name) {
            File pictureFile = getOutputMediaFile(name);
            if (pictureFile == null) {
                System.out.println("Error A");
            }else{
                try {
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    image.compress(Bitmap.CompressFormat.PNG, 90, fos);
                    fos.close();
                } catch (FileNotFoundException e) {
                    System.out.println("Error B");
                } catch (IOException e) {
                    System.out.println("Error C");
                }
            }

            return pictureFile;
        }

private File getOutputMediaFile(String name){
        File mediaStorageDir = new File(new Helper(this).getPathToAppFolder());

        // Create the storage directory if it does not exist
        if (! mediaStorageDir.exists()){
            if (! mediaStorageDir.mkdirs()){
                return null;
            }
        }
        // Create a media file name#
        File mediaFile;
        if(!name.equals(getString(R.string.training))){
            String timeStamp = new SimpleDateFormat("dd.MM.yyyy_HH:mm", Locale.getDefault()).format(new Date());
            String mImageName= name + "_" + timeStamp + ".jpg";
            mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
        }else{
            String mImageName= name + ".jpg";
            mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
        }

        return mediaFile;
    }

【问题讨论】:

  • 每个设备都有外部存储。并且每个应用程序都可以使用清单中请求的写入外部存储权限对其进行写入。如果您添加微型 SD 卡,则在此可移动存储上几乎无法写入。不清楚你在说什么。
  • user can save screenshots and files in his external storage。是吗?没有人可以检查您的代码,因为我们不知道 new Helper(this).getPathToAppFolder() 提供什么。
  • 它在棒棒糖上运行良好。 public String getPathToAppFolder(){ return Environment.getExternalStorageDirectory() + "/Android/data/" + context.getPackageName() + "/Files/"; }

标签: android file storage external


【解决方案1】:

您需要获得 Marshmallow 样式的权限,请参阅此处了解更多信息:https://guides.codepath.com/android/Understanding-App-Permissions#permission-updates-in-marshmallow

在运行文件保存操作之前,您需要检查权限是否被接受,如果不接受,则您决定让您的应用发生“正常”失败的原因。

【讨论】:

  • 我必须问还是一直问?
  • 永远是正确的方法。用户可以随时撤销权限,因此您需要能够处理它以避免与权限相关的崩溃。
【解决方案2】:

您需要从 Marshmallow 手动向用户请求权限以写入/读取手机存储空间。

查看此示例或使用此example 手动请求权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2014-10-09
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多