【问题标题】:FileProvider is very confusingFileProvider 非常混乱
【发布时间】:2018-04-06 13:59:00
【问题描述】:

我有一个应用程序,我在其中捕获图像并将其设置为 ImageView,然后将其上传到服务器。但是,每当我捕获图像时,图像都不会显示,当我尝试上传图像时,我会收到 FileNotFoundException,因为路径不包含图像。

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.example.android.imageuploader.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
</provider>

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="Image Uploader" path="Android/data/com.example.android.imageuploader/files/Pictures" />
</paths>

当我创建图像文件时,我使用它,

private File createImageFile() {
        String timeStamp = new SimpleDateFormat(
                getString(R.string.time_stamp_format), Locale.getDefault())
                .format(new Date());
        String fileName = getString(R.string.file_name_format, timeStamp);
        File storageDirectory =
                new File(Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_PICTURES), getString(R.string.app_name));
        if (!(storageDirectory.exists() || storageDirectory.mkdirs())) {
            Helper.showToastMessage(mContext, getString(R.string.warn_storage_dir));
        }
        return new File(storageDirectory.getPath() + File.separator + fileName);
    }

实际上,我将图像保存在内部存储目录“图片”中,并在其中创建应用程序名称后的文件夹,其中保存了所有图像。但是在将图像设置为 ImageView 时,我得到了不同的文件路径,

Image Uploader/Pictures/Image Uploader/20180406_101234.jpg

这就是图片没有显示和上传的原因。

我哪里出错了,我无法弄清楚。请帮忙。

【问题讨论】:

  • 是的,我浏览了文档,但我仍然很困惑。我也尝试使用 getFilesDir() 但仍然没有运气。
  • 如果您需要内部存储,请使用 作为 getFilesDir()。

标签: android


【解决方案1】:

这就是我的做法,效果很好。

AndroidManifest.xml

   <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.yourpackagename.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_path"/>
    </provider>

provider_path.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <external-path name="/storage/emulated/0" path="."/>
</paths>

createImageFile()确保你有读写外部存储权限

private File createImageFile() throws IOException
{

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "MYAPPNAME-" + timeStamp + ".png";
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory(),
            "YourAppFolder");
    File storageDir = new File(mediaStorageDir + "/Profile_Images");
    if (!storageDir.exists())
    {
        storageDir.mkdirs();
    }
    File image = new File(storageDir, imageFileName);
    return image;
}

click listener on button to take camera image

===Global Variables===
        Uri mUri; 
private static final int CAMERA_IMAGE_RESULT = 202;
    private static final String CAPTURE_IMAGE_FILE_PROVIDER = "com.yourpackagename.fileprovider";
===Global Variables===

        takeImageBTN.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                File file = null;
                try
                {
                    file = createImageFile();
                    mUri = FileProvider.getUriForFile(this,
                            CAPTURE_IMAGE_FILE_PROVIDER, file);

                    Log.d("uri", mUri.toString());
                    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    cameraIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mUri);
                    startActivityForResult(cameraIntent, CAMERA_IMAGE_RESULT);
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }

            }
        });

最后是onActivityResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode)
    {
        case CAMERA_IMAGE_RESULT:
        {
            if (resultCode == RESULT_OK)
            {
                if (mUri != null)
                {
                    Log.d("uriPath", mUri.getPath().replace("//", "/"));
                    String profileImageFilepath = mUri.getPath().replace("//", "/");
                    Log.d("path", profileImageFilepath);
                    profileIV.setImageURI(mUri);
                    /*Your Asynctask to upload Image using profileImageFilepath*/
                    new PostDataAsyncTask().execute(profileImageFilepath);

                }
            }
            break;
        }
    }
}

获取运行时权限

  <!-- == External Storage == -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

【讨论】:

  • 适用于 但当我将其更改为
猜你喜欢
  • 2018-11-30
  • 2016-11-19
  • 1970-01-01
  • 2013-01-26
  • 2019-11-06
  • 2020-01-02
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多