什么是 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?的主要内容,如果未能解决你的问题,请参考以下文章