什么是 com.google.android.apps.nbu.files.provider/2?

Posted

技术标签:

【中文标题】什么是 com.google.android.apps.nbu.files.provider/2?【英文标题】:What is com.google.android.apps.nbu.files.provider/2? 【发布时间】:2021-08-10 18:35:28 【问题描述】:

我打开了来自不同来源的 pdf 文件并得到了这个Intents

    文件管理器(谷歌文件)->内部存储->下载:Intent act=android.intent.action.VIEW dat=content://com.google.android.apps.nbu.files.provider/1/file:///storage/emulated/0/Download/Untitled.pdf typ=application/pdf flg=0x13000001 cmp=team.sls.testapp/.ActivityMain

    文件管理器(Google 文件)-> 下载:Intent act=android.intent.action.VIEW dat=content://com.google.android.apps.nbu.files.provider/2/1863 typ=application/pdf flg=0x13000001 cmp=team.sls.testapp/.ActivityMain

    下载管理器(来自通知面板):Intent act=android.intent.action.VIEW dat=content://com.android.providers.downloads.documents/document/1508 typ=application/pdf flg=0x13000003 cmp=team.sls.testapp/.ActivityMain

    电报聊天:Intent act=android.intent.action.VIEW dat=content://org.telegram.messenger.provider/media/Telegram/Telegram Documents/2_5276292126848585208.pdf typ=application/pdf flg=0x13000001 cmp=team.sls.testapp/.ActivityMain

什么是content://com.google.android.apps.nbu.files.provider/2/1863,为什么同一个文件的路径不同? 但更有趣的是——为什么案例 1 和 4 可以打开带有自定义扩展名的文件,而案例 2 和 3 却不能?

如果对案例1和2有什么误解,请看this question的截图

【问题讨论】:

“但更有趣的是——为什么案例 1 和 4 可以打开具有自定义扩展名的文件,而案例 2 和 3 却不能?” -- 他们的Uri 值没有文件扩展名。这是自定义文件扩展名在 Android 中一直无法正常运行的众多原因之一。 @CommonsWare,所以没有办法从任何地方打开具有自定义文件扩展名的文件吗?应用程序的标准 mime 类型机制对我们不可用? “所以没有办法从任何地方打开带有自定义文件扩展名的文件吗?” - 正确的。这与 Web 没有什么不同,其中 URL 不需要具有任何特定的文件扩展名。 “我们无法使用标准 mime 类型的应用程序机制吗?” -- 常见的 MIME 类型很好。例如,如果不是过滤扩展名,而是过滤 application/pdf MIME 类型,那么所有这四个都可以正常工作。 【参考方案1】:

所有这四个 Uri 都遵循相同的模式

content://com.google.android.apps.nbu.files.provider/1/file:///storage/emulated/0/Download/Untitled.pdf
content://com.google.android.apps.nbu.files.provider/2/1863
content://com.android.providers.downloads.documents/document/1508
content://org.telegram.messenger.provider/media/Telegram/Telegram Documents/2_5276292126848585208.pdf

content://PACKAGE_NAME.provider/CONTENT_DETAIL

显然PACKAGE_NAME 取决于应用程序。 CONTENT_DETAIL 是可选的,可以是 file_id 或 full_path。

如果您反编译所有这四个应用程序并查看它们的AndroidManifest.xml,您将看到相同的提供程序标记,但存在细微差别。

查看 Google Files 的 AndroidManifest.xml

<application>
  <provider 
    android:name="com.google.android.libraries.storage.storagelib.FileProvider" 
    android:exported="false" 
    android:authorities="com.google.android.apps.nbu.files.provider" 
    android:grantUriPermissions="true"/>
</application>

此提供程序将生成HierarchicalUri,如下所示 content://com.google.android.apps.nbu.files.provider/1651/2

使用下面的 sn-p,您可以从所有这四个应用程序中读取文件/内容。

public final class MainActivity extends AppCompatActivity

   @Override
    protected void onCreate(Bundle savedInstanceState) 
      Intent intent = getIntent();
      InputStream is = getContentResolver().openInputStream(intent.getData());
      String content = new String(Utils.unwrap(is));
      Log.i("TAG", "content: " + content);
   

   public static byte[] unwrap(InputStream is) throws IOException 
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int nRead;
        byte[] data = new byte[4096];
        while ((nRead = is.read(data, 0, data.length)) != -1) 
            baos.write(data, 0, nRead);
        
        baos.flush();
        is.close();
        baos.close();
        return baos.toByteArray();
   

希望我已经回答了你的问题。

【讨论】:

以上是关于什么是 com.google.android.apps.nbu.files.provider/2?的主要内容,如果未能解决你的问题,请参考以下文章

时间是什么?时间同步是什么?GPS北斗卫星授时又是什么?

什么是拉电流,什么是灌电流?什么是吸收电流 ?

在java中,OOA是什么?OOD是什么?OOP是什么?

什么是DIV,全称是什么?

什么是抢占/什么是可抢占内核?到底有什么好处呢?

什么是 JNDI?它的基本用途是什么?什么时候使用?