android - 将位图保存到 SD 卡不创建任何文件
问题描述
当按下按钮时,我想将位图作为 jpg 文件保存到我的 SD 卡。当我运行以下代码时,我没有收到任何错误,但是当我检查手机上的 SD 卡时,没有创建任何文件。我究竟做错了什么 ?
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
}
String root = Environment.getExternalStorageDirectory().toString();
//String root = System.getenv("SECONDARY_STORAGE");
File myDir = new File(root + "/Screenshots");
myDir.mkdirs();
Random generator = new Random();
int n = generator.nextInt(10000);
String fname = n+".jpg";
File file = new File(myDir, fname);
Log.d("DD",""+file);
if (file.exists()) {
file.delete();
}
try {
FileOutputStream out = new FileOutputStream(file);
rBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
我在清单中有权限,但仍然没有生成文件:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
我做了一些研究表明 getExternalStorageDirectory() 没有给出 SDcard 的路径,但以下替代方法给出了 null:
字符串根 = System.getenv("SECONDARY_STORAGE");
解决方案
找到了@CommonsWare 指出的答案,即调用 MediaScannerConnection.scanFile,因此 MediaStore 可以发现该文件并在文件资源管理器中列出它们。@greenapps 还建议文件位于外部存储 0 中,而不是 SD 卡中。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
}
String root = Environment.getExternalStoragePublicDirectory("").toString();
//String root = System.getenv("SECONDARY_STORAGE");
File myDir = new File(root + "/Screenshots");
if (!myDir.exists())
if (!myDir.mkdirs())
{Toast.makeText(activity, "make dir failed.", Toast.LENGTH_SHORT).show(); return;}
Random generator = new Random();
int n = generator.nextInt(10000);
String fname = n+".jpg";
File file = new File(myDir, fname);
Log.d("DD",""+file);
try {
FileOutputStream out = new FileOutputStream(file);
rBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
//add mediastore discovery
MediaScannerConnection.scanFile(activity, new String[] {file.getAbsolutePath()},new String[] {null}, null);
}
}
推荐阅读
- nearprotocol - 如何查看 NEAR 协议中的存储使用情况?
- laravel - Laravel 查询 col1 != col2
- reactjs - 无法在 MacOS 上的 Dockerized React Web 应用程序中连接到前端
- javascript - Mongodb,在键对值中查询
- nestjs - TypeORM 未创建预期的外键
- swift - 在运行测试之前,Vapor 中的测试会引发致命错误
- nsis - NSIS 按扩展名删除所有文件
- python - 从列表继承是不好的做法吗?
- reactjs - 如何更改语义 UI 反应 Grid.Column 填充
- android - 如何在后台获取电池电量并公布?