Java 如何使用FileProvider访问下载文件夹?
我制作了一个应用程序,在一个文件夹(由同一个应用程序制作)中创建一个*.csv文件,同时在Android的下载文件夹中 该文件可以与ShareIntent共享,问题是当应用程序在Android Oreo中运行时,用户试图创建*.csv文件,应用程序崩溃,引发的异常为: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
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)));