Android不在图库中创建文件夹

时间:2017-02-26 20:22:38

标签: java android toast

我正在尝试将JPG格式的图片保存在我的图库中的特定文件夹中。但我的代码不是创建一个目录,每当我创建一个Toast它返回给我/ storage / emulated / 0 / DCIM / MyFodler,但是什么时候我会打开画廊,这个foder不存在。我正在使用Android Marshmallow 6.0直接构建我的应用程序。

创建位图的代码:

    private Bitmap getToBitmap(ImageView view, int Width, int Heigth){
    Bitmap bitmap = Bitmap.createBitmap(Width,Heigth, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

尝试在图库中保存图片的代码:

    private void TrySaveMediaStore(){
    String path = Environment.getExternalStorageDirectory().toString();
    OutputStream FileOut = null;
    File file = new File(path,"DCIM/MyFolder");
    file.mkdirs();
    Toast.makeText(getApplicationContext(),file.getAbsolutePath(),Toast.LENGTH_SHORT).show();

    try{
        FileOut = new FileOutputStream(file);
        FileOut.flush();
        FileOut.close();
        Bitmap bitmap = getToBitmap(img,img.getMaxWidth(),img.getMaxHeight());
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,FileOut);
        MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), file.getName(), file.getName());
        Toast.makeText(this,file.getAbsolutePath(),Toast.LENGTH_SHORT).show();
    }catch (FileNotFoundException e){
        return;
    }catch (IOException e){
        e.printStackTrace();
    }

}

Androidmanifest权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

4 个答案:

答案 0 :(得分:1)

DCIM/MyFolder是一个目录。您可以使用mkdirs()将其创建为目录。

然后,您无法尝试使用DCIM/MyFolder作为保存JPEG的文件名。您需要在目录中创建一个文件。

所以,而不是:

FileOut = new FileOutputStream(file);

使用类似的东西:

File theActualImageFile=new File(file, "something.jpeg");
FileOut = new FileOutputStream(theActualImageFile);

此外:

答案 1 :(得分:0)

您可以使用以下代码询问运行时存储权限:

final int MyVersion = Build.VERSION.SDK_INT;
if (MyVersion > Build.VERSION_CODES.LOLLIPOP_MR1) {
                                if (!checkIfAlreadyhavePermission()) {                                                              

ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                                    } else {
                                       TrySaveMediaStore() ;
                                    }

checkIfAlreadyhavePermission()方法:

private boolean checkIfAlreadyhavePermission() {
        int result = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        return result == PackageManager.PERMISSION_GRANTED;
    }

添加onRequestPermission():

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 1: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    TrySaveMediaStore();

                } else {
                    Toast.makeText(this, "Please give your permission.", Toast.LENGTH_LONG).show();
                }
                break;
            }
        }
    }

创建文件扫描MediaStore后:

public void scanFile(Context c, File file, String mimeType) {
    MediaScannerConnection
        .scanFile(c, new String[] {file.getAbsolutePath()},
                  new String[] {mimeType}, null);
}

答案 2 :(得分:0)

我认为有一个问题,实际上图像确实在内存中插入很好,但是当我试图观看它并没有像我预期的那样显示时,我解决了它用扫描仪类刷新画廊,使用此代码:

MediaScannerConnection.scanFile(this,
        new String[] { file.toString() }, null,
        new MediaScannerConnection.OnScanCompletedListener() {
    public void onScanCompleted(String path, Uri uri) {
        Log.i("ExternalStorage", "Scanned " + path + ":");
        Log.i("ExternalStorage", "-> uri=" + uri);
    }
});

有关详细信息,请参阅此链接:How can I refresh the Gallery after I inserted an Image in android?

答案 3 :(得分:0)

是的,问题在于媒体扫描仪。你可以简单地使用终端检查文件(如果你没有它,请下载应用程序)并手动进入目录。我有同样的问题,但至少我知道文件在那里。