当前位置: 首页 > 知识库问答 >
问题:

Android操作系统。FileUrieExposedException:文件。jpg通过ClipData曝光了app之外的内容。项目getUri()

雍骏俊
2023-03-14

我试着做一个按钮来打开相机并拍照。我的代码在这里

//for imports check on bottom of this code block

public class HomeProfileActivity extends AppCompatActivity {
//Button camera
public static final String TAG = HomeProfileActivity.class.getSimpleName();
public static final int REQUEST_TAKE_PHOTO = 0;
public static final int REQUEST_TAKE_VIDEO = 1;
public static final int REQUEST_PICK_PHOTO = 2;
public static final int REQUEST_PICK_VIDEO = 3;
public static final int MEDIA_TYPE_IMAGE = 4;
public static final int MEDIA_TYPE_VIDEO = 5;

private Uri mMediaUri;
private ImageView photobutton;
private Button buttonUploadImage, buttonTakeImage;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_profile);
    ButterKnife.bind(this);
}

@OnClick(R.id.buttonTakeImage)
void takePhoto() {
    mMediaUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
    if (mMediaUri == null) {
        Toast.makeText(this,
                "There was a problem accessing your device's external storage.",
                Toast.LENGTH_LONG).show();
    }
    else {
        Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, mMediaUri);
        startActivityForResult(takePhotoIntent, REQUEST_TAKE_PHOTO);
    }
}

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

    if (resultCode == RESULT_OK){
        if (requestCode == REQUEST_TAKE_PHOTO) {
            Intent intent = new Intent(this, ViewImageActivity.class);
            intent.setData(mMediaUri);
            startActivity(intent);
        }
    }
    else if (resultCode != RESULT_CANCELED){
        Toast.makeText(this, "Sorry, there was an error", Toast.LENGTH_SHORT).show();
    }
}

private Uri getOutputMediaFileUri(int mediaType) {
    // check for external storage
    if (isExternalStorageAvailable()) {
        // get the URI

        // 1. Get the external storage directory
        File mediaStorageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);

        // 2. Create a unique file name
        String fileName = "";
        String fileType = "";
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());

        if (mediaType == MEDIA_TYPE_IMAGE) {
            fileName = "IMG_" + timeStamp;
            fileType = ".jpg";
        } else if (mediaType == MEDIA_TYPE_VIDEO) {
            fileName = "VID_" + timeStamp;
            fileType = ".mp4";
        } else {
            return null;
        }
        // 3. Create the file
        File mediaFile;
        try {
            mediaFile = File.createTempFile(fileName, fileType, mediaStorageDir);
            Log.i(TAG, "File: " + Uri.fromFile(mediaFile));

            // 4. Return the file's URI
            return Uri.fromFile(mediaFile);
        }
        catch (IOException e) {
                Log.e(TAG, "Error creating file: " +
                        mediaStorageDir.getAbsolutePath() + fileName + fileType);
            }
        }

        // something went wrong
        return null;
    }

private boolean isExternalStorageAvailable(){
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)){
        return true;
    }
    else {
        return false;
    }
}

import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import butterknife.ButterKnife;
import butterknife.OnClick;

我也有一个问题与starActivityForResult中的方法点击和导入java.text.SimpleDateFormats;也跳在异常运行时我正在使用BuildToolsversion sdk 25

共有3个答案

华衡
2023-03-14
Add the below code where the SharingIntent called:-

if(Build.VERSION.SDK_INT>=24){
                    try{
                        Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
                        m.invoke(null);
                        shareImage(Uri.fromFile(new File(Path)));
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
宗政海
2023-03-14

此信息来自:FileUriExposed异常

这仅适用于目标为N或更高的应用程序。针对早期SDK版本的应用程序可以共享file://Uri,但强烈建议不要这样做。

所以如果你的应用/构建。gradle文件的compileSdkVersion(构建目标)是Android N(API级别24)或更高版本,如果您编写的文件可能被其他应用程序访问,则会引发此错误。最重要的是,以下是你应该如何继续前进:

摘自这里:FileProvider

改变:

return Uri.fromFile(mediaFile);

成为

return FileProvider.getUriForFile(getApplicationContext(), getPackageName()+".fileprovider", mediaFile);

注意:如果你控制mydomain。com您还可以将getPackageName()“.fileprovider”替换为“com.mydomain.fileprovider”(下面的AndroidManifest.xml也是如此)。

您还需要将以下内容添加到您的Androidanifest.xml文件中

    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:grantUriPermissions="true"
        android:exported="false">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths" />
    </provider>

然后需要添加一个名为filepath的文件。xml到你的app/src/main/res/xml目录,包含以下内容

<paths>
    <external-files-path name="Pictures" path="Pictures" />
</paths>

注意:对于其他任何人,我们使用了上面的外部文件路径,因为Omer在代码中使用了getExteralFilesDir(环境。DIRECTORY_PICTURES)。对于任何其他位置,请检查“指定可用文件”部分下的文件提供程序,并根据文件的位置将外部文件路径更改为以下之一:

files-path
cache-path
external-path
external-files-path
external-cache-path

此外,请将上面的图片修改为您的文件夹名称。

要避免的一个重要反模式是不应该使用if(Build.VERSION.SDK_INT

我知道这是更多的工作,但是,这允许Android只允许与您共享的其他应用程序临时访问文件,这对用户的隐私更安全。

丁翊歌
2023-03-14

除了使用文件提供程序的解决方案之外,还有另一种方法可以解决这个问题

 StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
 StrictMode.setVmPolicy(builder.build());

在应用中。onCreate()方法。这样,VM就会忽略文件URI暴露。

 类似资料:
  • 前言 准备了很久,找了好多天资料,还不知道应该如何动笔写:因为担心拿捏不住,所以一方面继续查找资料,一方面思考如何来写。作为《Shell编程范例》的一部分,希望它能够很好地帮助 Shell 程序员理解如何用 Shell 命令来完成和 Linux 系统关系非常大的文件系统的各种操作,希望让 Shell 程序员中对文件系统"混沌"的状态从此消失,希望文件系统以一种更为清晰的样子呈现在眼前。 文件系统在

  • path/filepath 包涉及到路径操作时,路径分隔符使用 os.PathSeparator。不同系统,路径表示方式有所不同,比如 Unix 和 Windows 差别很大。本包能够处理所有的文件路径,不管是什么系统。 注意,路径操作函数并不会校验路径是否真实存在。 解析路径名字符串 Dir() 和 Base() 函数将一个路径名字符串分解成目录和文件名两部分。(注意一般情况,这些函数与 Uni

  • 6.3 操作外部系统资源 本节介绍的函数主要着眼于访问外部资源,比如最常用便是系统文件。 文件系统相关函数 glob() 按文件通配符搜索文件 globpath() 在系列目录中搜索文件 findfile() 在搜索路径中查找文件 finddir() 在搜索路径中查找目录 glob() 函数的作用,就相当于在 linux 终端命令 ls 所能列出的文件名。它可接收 至多四个参数,只有第一个是必须的

  • 我试图用这个代码从手机的相机拍照: 主要活动。xml: 主要活动。爪哇: 我还将这些权限添加到清单中。xml: 但我得到了这个错误信息: android.os.文件://存储/仿真/0/图片/picFolder/1.jpg通过ClipData暴露在应用程序之外。我tem.getUri() 问题是什么?如何解决? 编辑:这是更新的代码: 主要活动: 显示: 建筑gradle(应用程序): 这是新的错

  • 在我的应用程序中,我得到了android。操作系统。NetworkOnMainThreadException。我正在尝试从url获取图像,当时我遇到了这个异常。若我在2.2中运行应用程序,它可以正常工作,但若我在4.0中运行,就会出现异常。 我有错误 在这一行请帮我解决这个问题 我使用了AsyncTask 我在这行中遇到了错误: Logcat:

  • 本文向大家介绍操作系统和内核之间的区别,包括了操作系统和内核之间的区别的使用技巧和注意事项,需要的朋友参考一下 操作系统 操作系统管理计算机,并充当用户和计算机之间的接口。操作系统是启动计算机时启动的第一个程序。 核心 内核是操作系统的核心组件,负责将用户命令转换为机器级别的语言命令。 以下是操作系统和内核之间的重要区别。 序号 键 操作系统 核心 1 类型 操作系统是系统软件。 内核是操作系统的