Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用FileProvider访问下载文件夹?_Java_Android_Csv_Android Intent - Fatal编程技术网

Java 如何使用FileProvider访问下载文件夹?

Java 如何使用FileProvider访问下载文件夹?,java,android,csv,android-intent,Java,Android,Csv,Android Intent,我制作了一个应用程序,在一个文件夹(由同一个应用程序制作)中创建一个*.csv文件,同时在Android的下载文件夹中 该文件可以与ShareIntent共享,问题是当应用程序在Android Oreo中运行时,用户试图创建*.csv文件,应用程序崩溃,引发的异常为: android.os.FileUriExposedException: at android.os.StrictMode.onFileUriExposed (StrictMode.java:1958) at androi

我制作了一个应用程序,在一个文件夹(由同一个应用程序制作)中创建一个*.csv文件,同时在Android的下载文件夹中

该文件可以与ShareIntent共享,问题是当应用程序在Android Oreo中运行时,用户试图创建*.csv文件,应用程序崩溃,引发的异常为:

android.os.FileUriExposedException: 
  at android.os.StrictMode.onFileUriExposed (StrictMode.java:1958)
  at android.net.Uri.checkFileUriExposed (Uri.java:2348)
  at android.content.ClipData.prepareToLeaveProcess (ClipData.java:941)
  at android.content.Intent.prepareToLeaveProcess (Intent.java:9735)
  at android.content.Intent.prepareToLeaveProcess (Intent.java:9741)
  at android.content.Intent.prepareToLeaveProcess (Intent.java:9720)
  at android.app.Instrumentation.execStartActivity (Instrumentation.java:1795)
  at android.app.Activity.startActivityForResult (Activity.java:4495)
  at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult (BaseFragmentActivityJB.java:50)
  at android.support.v4.app.FragmentActivity.startActivityForResult (FragmentActivity.java:79)
  at android.app.Activity.startActivityForResult (Activity.java:4453)
  at android.support.v4.app.FragmentActivity.startActivityForResult (FragmentActivity.java:859)
  at android.app.Activity.startActivity (Activity.java:4814)
  at android.app.Activity.startActivity (Activity.java:4782)
  at com.bpl.spart.bloodpressurelogbook.MainActivity$createReportTask.onPostExecute (MainActivity.java:517)
  at com.bpl.spart.bloodpressurelogbook.MainActivity$createReportTask.onPostExecute (MainActivity.java:420)
我知道我应该使用FileProvider来创建API级别>24的Uri,但是如何使用FileProvider从下载文件夹中的文件授予访问权限

这是我当前的代码:

        Intent ShareIntent = new Intent(android.content.Intent.ACTION_SEND);
        ShareIntent.setType("text/csv");
        ShareIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] {getString(R.string.reporteTomasDePresion)});
        ShareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, nombreReporte);

        ShareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
        startActivity(Intent.createChooser(ShareIntent, getString(R.string.compartirReporte)));
其中“f”是对.csv文件的引用

public File getDocumentsStorageDir(String directorio){
    File file = new File(getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS),directorio);

    if(!file.mkdir()){
        Log.e("StatusArchivo","Directorio no creado");
    }

    return file;

}

        File file =  getDocumentsStorageDir(REPORTDIR);
        Calendar cal = Calendar.getInstance();
        //sdf = new SimpleDateFormat("dd-MM-yyyy-HH-mm");
        nombreReporte = "BPReport"+sdf.format(cal.getTime())+".csv";
        f = new File(file.getAbsolutePath(),nombreReporte);
        String csvFIle = "";
        String sistolicaS;
        String diastolicaS;
        String pulsoS;
        String posicionS;
        String extremidadS;
        String notaS;
        String fechaS;

        if(params[0].getCount() > 0 ) {

            try {
                OutputStreamWriter fout = new OutputStreamWriter(new FileOutputStream(f), StandardCharsets.ISO_8859_1);
                String nombre = getString(R.string.Nombre);
                String nombreDeUsuario = sharedPref.getString("nombreDelUsuario","");

                String edad = getString(R.string.Edad);
                String edadUsuario = sharedPref.getString("edadDelUsuario","");

                String peso = getString(R.string.Peso);
                String pesoUsuario = sharedPref.getString("pesoDelUsuario","");
                String UnidadDePeso = sharedPref.getString("unidadPeso",getString(R.string.kilos));

                String enfermedades = getString(R.string.Enfermedad);
                String enfermedadesUsuario = sharedPref.getString("enfermedadesDelUsuario","");

                String linea1 = nombre+": ," + nombreDeUsuario + "\n";
                fout.write(linea1);

                String linea2 = edad+": ," + edadUsuario + "\n";
                fout.write(linea2);

                String linea3 = peso+": ," + pesoUsuario + UnidadDePeso + "\n";
                fout.write(linea3);

                String linea4 = enfermedades+": ," + enfermedadesUsuario + "\n";
                fout.write(linea4);

                String tituloColumnas = getString(R.string.presionsistolica) + "," + getString(R.string.presiondiastolica) + "," + getString(R.string.pulsotil) + "," + getString(R.string.posiciontil) + "," + getString(R.string.extremidadtil) + "," + getString(R.string.notatil) + "," + getString(R.string.fechatil) + "\n";
                fout.write(tituloColumnas);


                params[0].moveToFirst();

                if (params[0].moveToFirst()) {
                    for (int j = 0; j < params[0].getCount(); j++) {

                        sistolicaS = params[0].getString(params[0].getColumnIndex(Contrato.Columnas.SISTOLICA));
                        diastolicaS = params[0].getString(params[0].getColumnIndex(Contrato.Columnas.DIASTOLICA));
                        pulsoS = params[0].getString(params[0].getColumnIndex(Contrato.Columnas.PULSO));
                        posicionS = params[0].getString(params[0].getColumnIndex(Contrato.Columnas.POSICION));
                        extremidadS = params[0].getString(params[0].getColumnIndex(Contrato.Columnas.EXTREMIDAD));
                        notaS = params[0].getString(params[0].getColumnIndex(Contrato.Columnas.NOTA));
                        fechaS = params[0].getString(params[0].getColumnIndex(Contrato.Columnas.FECHA));

                        Log.v("CSV1", csvFIle);
                        csvFIle = "\"" + sistolicaS + "\",\"" + diastolicaS + "\",\"" + pulsoS + "\",\"" + posicionS + "\",\"" + extremidadS + "\",\"" + notaS + "\",\"" + fechaS + "\"\n";
                        Log.v("CSV2", csvFIle);
                        fout.write(csvFIle);
                        params[0].moveToNext();

                    }
                }

                fout.close();
                c.close();
公共文件getDocumentsStorageDir(字符串目录){
File File=新文件(getExternalStoragePublicDirectory(目录\下载),directorio);
如果(!file.mkdir()){
Log.e(“StatusArchivo”,“Directorio no creado”);
}
返回文件;
}
File File=getDocumentsStorageDir(REPORTDIR);
Calendar cal=Calendar.getInstance();
//sdf=新的简化格式(“dd-MM-yyyy-HH-MM”);
nombreport=“BPReport”+sdf.format(cal.getTime())+“.csv”;
f=新文件(File.getAbsolutePath(),nombreport);
字符串csvFIle=“”;
西索里亚斯群岛;
弦舒张期;
弦脉冲;
字符串位置;
弦极值;
字符串notaS;
字符串fechaS;
如果(参数[0].getCount()>0){
试一试{
OutputStreamWriter fout=新的OutputStreamWriter(新文件OutputStream(f),StandardCharset.ISO_8859_1);
String nombre=getString(R.String.nombre);
字符串nombreDeUsuario=SharedRef.getString(“nombreDeUsuario”,即“”);
stringedad=getString(R.String.edad);
字符串edadUsuario=sharedPref.getString(“edadDelUsuario”,“”);
字符串比索=getString(R.String.peso);
字符串pesoUsuario=sharedPref.getString(“pesoDelUsuario”,即“”);
String UnidadDePeso=sharedPref.getString(“unidadPeso”,getString(R.String.kilos));
String enfermedades=getString(R.String.Enfermedad);
字符串enfermedadesUsuario=sharedPref.getString(“enfermedadesDelUsuario”,”);
字符串linea1=nombre+“:,“+nombreduesuario+”\n”;
四、书写(第1行);
字符串linea2=edad+“:,“+edadUsuario+”\n”;
四、书写(第二行);
字符串linea3=peso+:,“+pesoUsuario+UnidadDePeso+”\n”;
四、书写(第三行);
字符串linea4=enfermedades+“:,“+enfermedadesUsuario+”\n”;
四、书写(第四行);
String tituloColumnas=getString(R.String.presionistolica)+“,“+getString(R.String.presiondisatolica)+”,“+getString(R.String.pulsotil)+”,“+getString(R.String.posiciontil)+”,“+getString(R.String.extremidadtil)+”,“+getString(R.String.notatil)+”,“+getString(R.String.fechatil)+”\n”;
四、写作(提多专栏);
参数[0]。moveToFirst();
if(参数[0]。moveToFirst()){
对于(int j=0;j
我在我添加的path.xml文件中找到了答案:

<?xml version="1.0" encoding="utf-8"?>
<paths
    xmlns:android="http://schemas.android.com/apk/res/android">

    <external-path
        name="Descarga"
        path="Download/"/>

    <files-path name="nombre"
        path="reportes" />
</paths>
用于:

另外,Android Oreo中的FileUrieExposedException问题现在已经不存在了

 ShareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));
    startActivity(Intent.createChooser(ShareIntent,getString(R.string.compartirReporte)));
        Uri fileUri = FileProvider.getUriForFile(MainActivity.this,"com.bpl.spart.bloodpressurelogbook.fileprovider",f);

        ShareIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
        startActivity(Intent.createChooser(ShareIntent, getString(R.string.compartirReporte)));