我正在尝试将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" />
答案 0 :(得分:1)
DCIM/MyFolder
是一个目录。您可以使用mkdirs()
将其创建为目录。
然后,您无法尝试使用DCIM/MyFolder
作为保存JPEG的文件名。您需要在目录中创建一个文件。
所以,而不是:
FileOut = new FileOutputStream(file);
使用类似的东西:
File theActualImageFile=new File(file, "something.jpeg");
FileOut = new FileOutputStream(theActualImageFile);
此外:
如果targetSdkVersion
为23或更高,则需要处理runtime permissions
图库应用程序既不会看到目录也不会看到文件,直到you tell the MediaStore
to index the newly-created JPEG
答案 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)
是的,问题在于媒体扫描仪。你可以简单地使用终端检查文件(如果你没有它,请下载应用程序)并手动进入目录。我有同样的问题,但至少我知道文件在那里。