首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法解析方法getExternalFilesDir()

无法解析方法getExternalFilesDir()
EN

Stack Overflow用户
提问于 2020-12-03 19:51:15
回答 2查看 496关注 0票数 0

我正在迁移到Android10,并尝试使用getExternalFilesDir()而不是Environment.getExternalStorageDirectory()。但是,IDE无法解析该方法。请帮我修一下。提前感谢!

代码语言:javascript
运行
复制
 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");
}
EN

回答 2

Stack Overflow用户

发布于 2020-12-03 20:42:30

要与外部存储交互,您需要创建一个file_path.xml,并在清单中声明一个FileProvider,如下所示:

file_paths.xml:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="images"
        path="AppName" />
</paths>

AndroidManifest.xml:

代码语言:javascript
运行
复制
    <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这样的函数可以帮助你实现这一点。

用摄像头拍照并保存到目录的方法:

代码语言:javascript
运行
复制
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的方法

代码语言:javascript
运行
复制
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

票数 0
EN

Stack Overflow用户

发布于 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。如果向此函数提供非空类型,则返回的文件将是指向给定类型的子目录的路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65125446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档