2017-03-02 130 views
2

我在我的应用程序中有一个FileProvider,它假装它正在工作,但它打开的文件是空白的。我已经确认该文件已经在指定目录中的设备上,并且不是空白的,但是当我尝试从应用程序中打开它时,它会失败。没有崩溃,也没有错误消息。有没有人见过这个?FileProvider正在打开PDF,但它是空白的。为什么?

FileProvider:

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

provider_paths.xml

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

代码:

var path = "/storage/emulated/0/MyApp/User/attachments/folder/attachment.pdf" 
    var file = new Java.IO.File(path); 
    var mime = MimeTypeMap.Singleton; 
    var ext = MimeTypeMap.GetFileExtensionFromUrl(path).ToLower(); 
    var type = mime.GetMimeTypeFromExtension(ext); 

    var intent = new Intent(); 
    intent.SetAction(Intent.ActionView); 
    var name = activity.PackageName + ".provider"; 
    var uri = FileProvider.GetUriForFile(activity.ApplicationContext, name, file); 
    intent.SetDataAndType(uri, type); 
    intent.SetFlags(ActivityFlags.GrantReadUriPermission); 
    intent.SetFlags(ActivityFlags.GrantWriteUriPermission); 

    var packageManager = activity.PackageManager; 
    if (intent.ResolveActivity(packageManager) != null) 
     activity.RunOnUiThread(() => activity.StartActivity(intent)); 
    else 
    { 
     var message = "No viewer for attachments: " + type; 
     activity.RunOnUiThread(() => 
      Snackbar.Make(view, message, Snackbar.LengthLong).Show() 
     ); 
    } 

我已经调试,看看有什么URI最终被,它看起来正确的:

u ri.Path:

"/external_storage/MyApp/User/attachments/folder/attachment.pdf" 

uri.ToString():

"content://com.my.redacted.provider/external_storage/MyApp/User/attachments/folder/attachment.pdf" 

所以,我真的不知道是怎么回事。

注意:我的文档在/ storage/emulated/0/MY_STUFF中,我确实检查了这是<external-path>返回的内容。

+0

'新的java.io.File(路径);'。请显示路径的价值。 – greenapps

+0

我在这一点上加入了我的问题。该路径具有外部目录作为它的一部分。 –

+0

请告诉uri.getPath()和uri.toString()的值。 – greenapps

回答

0

文件资源管理器提供文件系统路径。但现在你提供一个内容方案路径。你确定观众能够处理内容计划吗?尝试其他应用。

2

我有同样的问题。没有PDF阅读器可以打开我的文件从FileProvider提供。

我的溶液中加入标志GRANT_READ_URI_PERMISSION:

intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_GRANT_READ_URI_PERMISSION); 

也许你的错,是覆盖在代码中FLAG_GRANT_READ_URI_PERMISSION

intent.setFlags(ActivityFlags.GrantReadUriPermission); 
intent.setFlags(ActivityFlags.GrantWriteUriPermission); <- overrides the 1st flag 
相关问题