Java Android无法在库中创建文件夹

Java Android无法在库中创建文件夹,java,android,toast,Java,Android,Toast,我正在尝试将JPG格式的图像保存到我的图库中的特定文件夹中。但是我的代码并不是在创建目录,每当我创建一个Toast时,它都会返回给我/storage/emulated/0/DCIM/MyFodler,但是我什么时候打开库,这个foder不存在。我正在用安卓棉花糖6.0构建我的设备的应用程序direct 创建位图的代码: private Bitmap getToBitmap(ImageView view, int Width, int Heigth){ Bitmap bitmap

我正在尝试将JPG格式的图像保存到我的图库中的特定文件夹中。但是我的代码并不是在创建目录,每当我创建一个Toast时,它都会返回给我/storage/emulated/0/DCIM/MyFodler,但是我什么时候打开库,这个foder不存在。我正在用安卓棉花糖6.0构建我的设备的应用程序direct

创建位图的代码:

    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" />

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

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

因此,不是:

FileOut = new FileOutputStream(file);
使用类似于:

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

  • 如果您的
    targetSdkVersion
    为23或更高,则需要处理

  • gallery应用程序将无法看到目录或文件,直到


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

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() ;
                                    }
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;
            }
        }
    }
checkIfAlreadyhavePermission()方法:

添加onRequestPermission():

创建文件扫描MediaStore后:

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

我想a也有同样的问题,实际上图像确实很好地插入到内存中,但是当我试图观看它时,它没有如我所期望的那样显示,我用scanner类刷新了gallery,解决了这个问题,使用了以下代码:

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

有关更多信息,请参阅此链接:

是的,问题在于媒体扫描仪。您只需使用终端检查文件(如果您没有应用程序,请下载),然后手动转到目录。我也遇到了同样的问题,但至少我知道文件在那里。

你问过运行时存储权限吗?没有,我没有问。你好,@MatheusSaviczki,你解决问题了吗。事实上,我已经尝试了下面的检查解决方案,但它不适合我。如果你已经解决了你的问题,那么请帮助我。好的,我去试试,我用反馈我用运行计时器请求和权限测试,它创建了文件夹,我用扫描检查了文件夹,当我保存文件时,它不会显示在我的图库中image@MatheusSaviczki:“我扫描了文件夹”--您不扫描文件夹。创建JPEG文件后,即可扫描JPEG文件。您可能还需要刷新或退出并重新启动gallery应用程序,因为它在运行时可能检测不到新添加的图像。我关闭了它并检查了它,但它不在gallery中。我使用它来扫描:private void scanFile(String path){MediaScannerConnection.scanFile(MainActivity.this,new String[]{path},null,新MediaScannerConnection.OnScanCompletedListener(){public void onScanCompleted(字符串路径,Uri Uri){Log.i(“标记”,“已完成扫描”+路径);}}}}}}}此外,它还不会显示在我的Gallery测试中,并带有运行计时器请求和权限,它创建了文件夹,我用扫描检查了文件夹,当我保存图像时,它没有显示在我的图库中。你是否按照@commonware的建议扫描了你的Mediastore?除非您这样做,否则此库将无法知道您新创建的文件的目录。我把它添加到我的答案中。我用它来扫描:私有void扫描文件(字符串路径){MediaScannerConnection.scanFile(MainActivity.this,新字符串[]{path},null,新mediascannerconnerconnection.OnScanCompletedListener(){public void onScanCompleted(字符串路径,Uri Uri Uri){Log.I(“标记”,“完成扫描”+path);}}})更重要的是,它还没有在我的厨房里出现。我能够解决我的问题,伙计们,谢谢你们所做的一切
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);
    }
});