Android不在图库中创建文件夹

Posted

技术标签:

【中文标题】Android不在图库中创建文件夹【英文标题】:Android not create a folder in gallery 【发布时间】:2017-02-26 20:22:38 【问题描述】:

我正在尝试将 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" />

【问题讨论】:

您是否询问了运行时存储权限? 不,我不问。 您好,@MatheusSaviczki,您的问题解决了吗。实际上我已经尝试过以下检查的解决方案,但它对我不起作用。如果你已经解决了你的问题,那么请帮助我。 【参考方案1】:

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

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

所以,而不是:

FileOut = new FileOutputStream(file);

使用类似的东西:

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

还有:

你需要处理runtime permissions,如果你的targetSdkVersion是23或更高

在you tell the MediaStore to index the newly-created JPEG

之前,图库应用既看不到目录也看不到文件

【讨论】:

好的,我去试试,我回来反馈 我使用运行时请求和权限进行测试,它创建了文件夹,我通过扫描检查了该文件夹,当我保存图像时它没有显示在我的画廊中 @MatheusSaviczki:“我通过扫描检查了文件夹”-您没有扫描文件夹。创建 JPEG 文件后,您扫描 JPEG 文件。您可能还需要刷新或退出并重新启动图库应用,因为它在运行时可能无法检测到新添加的图像。 我关闭它并检查了它,但它不在画廊中。 我用它来扫描: private void scanFile(String path) MediaScannerConnection.scanFile(MainActivity.this, new String[] path , null, new MediaScannerConnection.OnScanCompletedListener() public void onScanCompleted (String path, Uri uri) Log.i("TAG", "完成扫描" + path); ); 更多它还没有显示在我的画廊中【参考方案2】:

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

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】:

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

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

【讨论】:

我使用运行时请求和权限进行测试,它创建了文件夹,我通过扫描检查了该文件夹,当我保存图像时它没有显示在我的画廊中 您是否按照@CommonsWare 的建议扫描了您的 Mediastore?除非你这样做,否则这个画廊将无法知道你新创建的文件的目录。我已将此添加到我的答案中。 我用它来扫描: private void scanFile(String path) MediaScannerConnection.scanFile(MainActivity.this, new String[] path , null, new MediaScannerConnection.OnScanCompletedListener() public void onScanCompleted (String path, Uri uri) Log.i("TAG", "完成扫描" + path); ); 更多它还没有显示在我的画廊中 我能够解决我的问题,感谢你们所做的一切【参考方案4】:

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

【讨论】:

以上是关于Android不在图库中创建文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 11 中创建从图库中选择图像的意图?

我可以在 Android 中创建自定义图像 MIME 类型吗?

PDF多页不在android中创建[关闭]

Qsettings 适用于 32 位 apk 但不在我的 64 位 apk 中创建文件

Directory.CreateDirectory() 不在 ZipFile 中创建文件夹

在 PHP 中创建文件并将其上传到 FTP 服务器而不在本地保存