有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android未在库中创建文件夹

我正在尝试将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 安卓:name="安卓.permission.INTERNET" />
<uses-permission 安卓:name="安卓.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission 安卓:name="安卓.permission.READ_EXTERNAL_STORAGE" />

共 (4) 个答案

  1. # 1 楼答案

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

    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. # 2 楼答案

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

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

  3. # 3 楼答案

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

  4. # 4 楼答案

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

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

    因此,不是:

    FileOut = new FileOutputStream(file);
    

    使用类似于:

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

    此外: