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 类型吗?
Qsettings 适用于 32 位 apk 但不在我的 64 位 apk 中创建文件