亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問如何使用支持FileProvider將內容分享給其他應用程序?

請問如何使用支持FileProvider將內容分享給其他應用程序?

Cats萌萌 2019-11-17 16:12:02
如何使用支持FileProvider將內容分享給其他應用程序?我正在尋找一種方法,使用Android支持庫的FileProvider正確地與外部應用程序共享(而不是OPEN)內部文件。按照文檔上的示例,<provider     android:name="android.support.v4.content.FileProvider"     android:authorities="com.example.android.supportv4.my_files"     android:grantUriPermissions="true"     android:exported="false">     <meta-data         android:name="android.support.FILE_PROVIDER_PATHS"         android:resource="@xml/my_paths" /></provider>并使用ShareCompat將文件共享給其他應用程序,如下所示:ShareCompat.IntentBuilder.from(activity).setStream(uri) // uri from FileProvider.setType("text/html").getIntent().addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)不起作用,因為FLAG_GRANT_READ_URI_PERMISSION僅授予data對intent 指定的Uri的權限,而不授予EXTRA_STREAMextra 的值(由set設置setStream)。我試圖通過設置成安全android:exported到true的供應商,但FileProvider在內部檢查,如果本身是出口,所以時,它拋出一個異常。
查看完整描述

2 回答

?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

使用FileProvider支持庫,您必須手動授予和撤消其他應用程序讀取特定Uri的權限(在運行時)。使用Context.grantUriPermission和Context.revokeUriPermission方法。

例如:

//grant permision for app with package "packegeName", eg. before starting other app via intentcontext.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);//revoke permisionscontext.revokeUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);

作為最后的手段,如果您無法提供包名稱,則可以向所有可以處理特定意圖的應用授予權限:

//grant permisions for all apps that can handle given intentIntent intent = new Intent();intent.setAction(Intent.ACTION_SEND);...List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);for (ResolveInfo resolveInfo : resInfoList) {
    String packageName = resolveInfo.activityInfo.packageName;
    context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);}

根據文檔的替代方法:

  • 通過調用setData()將內容URI放入Intent中。

  • 接下來,使用FLAG_GRANT_READ_URI_PERMISSION或FLAG_GRANT_WRITE_URI_PERMISSION或兩者調用方法Intent.setFlags()。

  • 最后,將Intent發送到另一個應用程序。通常,您通過調用setResult()來完成此操作。

    在接收活動的堆棧處于活動狀態時,Intent中授予的權限仍然有效。堆棧完成后,將
    自動刪除權限。授予
    客戶端應用程序中一個活動的權限會自動擴展到
    該應用程序的其他組件。

順便說一句。如果需要,可以復制FileProvider的源代碼并更改attachInfo方法,以防止提供程序檢查是否已導出。



查看完整回答
反對 回復 2019-11-18
  • 2 回答
  • 0 關注
  • 476 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號