我正在迁移到Android10,并尝试使用getExternalFilesDir()
而不是Environment.getExternalStorageDirectory()
。但是,IDE无法解析该方法。请帮我修一下。提前感谢!
public String saveImageToSD(Bitmap bmp, String filename, Bitmap.CompressFormat format) {
File file2 = null;
try {
String path1 = getExternalFilesDir().toString();
FileOutputStream fos = null;
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bmp.compress(format, 100, bytes);
File file1 = new File(path1 + "/s/Gallery/");
if (!file1.exists()) {
file1.mkdirs();
}
// Log.e("TAG", "File name : " + file1.getAbsolutePath());
file2 = new File(file1, filename);
try {
file2.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
try {
fos = new FileOutputStream(file2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
fos.write(bytes.toByteArray());
fos.close();
Log.e("Success", "Final Image Saved - " + filename);
} catch (IOException e) {
e.printStackTrace();
}
Rowan.FinalBitmap = bmp;
FinalURI = "" + path1 + "/s/Gallery/" + filename;
ContentValues image = new ContentValues();
String dateStr = "04/05/2010";
SimpleDateFormat curFormater = new SimpleDateFormat("dd/MM/yyyy");
Date dateObj = curFormater.parse(dateStr);
SimpleDateFormat postFormater = new SimpleDateFormat("MMMM dd, yyyy");
}
public void mergeAndSave() {
Bitmap bmOverlay = Bitmap.createBitmap(drawing_view_container.getWidth(), drawing_view_container.getHeight(), Bitmap.Config.ARGB_8888);
try {
bmOverlay = MainGPUImageView.capture();
} catch (InterruptedException e) {
e.printStackTrace();
}
saveImageToSD(bmOverlay, "photox_" + generateRandomName(1000000, 5000000) + ".jpg", Bitmap.CompressFormat.JPEG);
Log.i("TAG", "Image Created");
}
发布于 2020-12-03 20:42:30
要与外部存储交互,您需要创建一个file_path.xml,并在清单中声明一个FileProvider,如下所示:
file_paths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="images"
path="AppName" />
</paths>
AndroidManifest.xml:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.example.appname"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths">
</meta-data>
</provider>
完成后,您可以调用SDK来添加或删除文件。如果你的应用针对的是Android 6和更高版本,你必须在运行时请求权限,并在尝试访问存储之前检查权限是否已被授予。我使用Dexter来管理运行时权限。像so这样的函数可以帮助你实现这一点。
用摄像头拍照并保存到目录的方法:
private void takeCameraImage() {
Dexter.withActivity(this)
.withPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {
if (report.areAllPermissionsGranted()) {
fileName = System.currentTimeMillis() + ".jpg";
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, getCacheImagePath(fileName));
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
返回文件的URI的方法
private Uri getCacheImagePath(String fileName) {
File path = new File(Environment.getExternalStorageDirectory(), "AppName");
if (!path.exists()) path.mkdirs();
File image = new File(path, fileName);
return getUriForFile(ImagePickerActivity.this, getPackageName(), image);
}
然后,您可以通过覆盖onActivityResult()方法对该文件执行某些操作。
注意:File()
对象接受两个参数:File(File parent, @NonNull String child)
子对象必须与file_paths.xml
中声明的路径之一匹配。在本例中,我使用了AppName
。
发布于 2020-12-03 20:48:02
确保在Context
中(例如:在活动中)或作为上下文的实例方法调用getExternalFilesDir(String type)
。
getExternalFilesDir(String type)
需要一个类型。你少了一个。
根据您的需要选择适当的type
。示例:文件目录的根目录为getExternalFilesDir(null)
。
如果您正在查看其他type
,请从docs
对于文件目录的根目录,
type
可以是null,或者对于子目录可以是以下常量之一: Environment.DIRECTORY_MUSIC、Environment.DIRECTORY_PODCASTS、Environment.DIRECTORY_RINGTONES、Environment.DIRECTORY_ALARMS、Environment.DIRECTORY_NOTIFICATIONS、Environment.DIRECTORY_PICTURES或Environment.DIRECTORY_MOVIES。如果向此函数提供非空类型,则返回的文件将是指向给定类型的子目录的路径。
https://stackoverflow.com/questions/65125446
复制相似问题