Java Android无法在库中创建文件夹
我正在尝试将JPG格式的图像保存到我的图库中的特定文件夹中。但是我的代码并不是在创建目录,每当我创建一个Toast时,它都会返回给我/storage/emulated/0/DCIM/MyFodler,但是我什么时候打开库,这个foder不存在。我正在用安卓棉花糖6.0构建我的设备的应用程序direct 创建位图的代码: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
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);
此外:
- 如果您的
为23或更高,则需要处理targetSdkVersion
- 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);
}
});