2017-10-11 49 views
1

原谅我可能是一个愚蠢的问题,但我真的无法在任何地方找到答案。从我刚创建的文件中获取Uri(安卓)

我需要我的程序将EditText的内容保存为html文件并与其他应用程序共享。为此,我需要将文件写入内部存储器,然后获取URI。但是,如何做到这一点,没有任何信息(我可以罚款)。

这是我的代码(编辑作为活动的名称和MYAPP包):

String filename = "Lorem ipsum.html"; 

      FileOutputStream outputStream; 

      try { 
       outputStream = openFileOutput(filename, Context.MODE_PRIVATE); 
       outputStream.write(Html.toHtml(textField.getText()).getBytes()); 
       outputStream.close(); 
       System.out.println(filename); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

       Intent shareIntent = ShareCompat.IntentBuilder.from(Editor.this) 
         .setStream(FileProvider.getUriForFile(Editor.this, "com.myapp.fileprovider", new File(filename))) 
         .getIntent(); 
       shareIntent.setData(FileProvider.getUriForFile(Editor.this, "com.myapp.fileprovider", new File(filename))); 
       shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
      startActivity(shareIntent); 

据我所知道的,文件创建工作的一部分就好;没有例外被捕获。然而,实际的共享部分与此错误崩溃:

java.lang.IllegalArgumentException: Failed to find configured root that contains /Lorem ipsum.html 

试图找到URI时,我清楚地做错事,但我一直无法找到一个解决方案。官方文件没有帮助,我找不到这个具体问题的例子。

如果它的事项,这是我的fileprovider声明:

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

预先感谢您的任何帮助。

回答

2

在您的代码:

FileProvider.getUriForFile(Editor.this, "com.myapp.fileprovider", new File(filename)) 

第三个参数是等价于:

new File("Lorem ipsum.html""); 

这是无效的。

您应该使用文件的完整路径作为File的构造函数中的参数。

正如评论说@Fatih你应该使用

new File(getFilesDir(), filename) 

作为第三个参数。

而且在体现你的authorities参数应纠正为:

android:authorities="${applicationId}.provider" 

因此,最终的声明将是:

Uri uri= FileProvider.getUriForFile(Editor.this, 
     getApplicationContext().getPackageName() + ".provider", 
     new File(Editor.this.getFilesDir(), filename)); 
+0

这是我的问题的一部分,虽然 - 我不知道的路径是什么以及如何找到它 – Sauron

+0

其中是位于您的手机中的文件? –

+0

我试图访问我刚刚创建的文件(使用我发布的代码),但我不确定应用程序将其保存在哪里。 – Sauron