跳到主要內容

Error : android.os.FileUriExposedException

android.os.FileUriExposedException


RootCause:從Android 7.0開始,一個應用提供自身檔案給其它應用使用時,如果給出一個file://格式的URI的話,應用會丟擲FileUriExposedException。這是由於谷歌認為目標app可能不具有檔案許可權,會造成潛在的問題。
Solution: 使用FileProvider
code java
Uri uri=FileProvider.getUriForFile(context,                  context.getApplicationContext().getPackageName(), imgFile);
//                 Uri uri = Uri.fromFile(imgFile);

or

FileProvider.getUriForFile(context,      context.getApplicationContext().getPackageName(), mCsvFile)


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

add xml file 
file name file_paths
<?xml version="1.0" encoding="utf-8"?><resources>    <paths>        <root-path name="root" path=""/>        <files-path name="files" path=""/>        <files-path name="Pictures" path="Pictures"/>        <cache-path name="cache" path=""/>        <external-path name="external" path=""/>        <external-files-path name="external_file_path" path=""/>        <external-cache-path name="external_cache_path" path=""/>    </paths></resources>




留言

這個網誌中的熱門文章

Android平台下使用GStreamer How to build GStreamer

  GStreamer 環境建置 設備環境 : OS: Windows 10 專業版 Android Studio: 4.0.1 classpath 'com.android.tools.build:gradle:3.1.4' GStreame SDK : 1.18.4     1.       GStreame 官方網站,下載 GStreameSDK 點選 android Tutorials 官方安裝說明 點選 GStreamer binaries   下載 GStreameSDK ,這邊點選 1.18.4 tarball 及 Android NDKs used r21 GStreameSDK 解壓縮內容 建立資料夾命名 GStreameSDK ,存放至 C:\GStreameSDK\1.18.4\ Android NDK 2.       下載 GStreamer 官方範例,點選左邊連結連至 GStreame gitlab ,並點選 gst-doc s 下載範例 gst-docs 3.       載入專案,點選 File->New->ImportProject 新增 gradel.properties gstAndroidRoot = C \:\\ GStreamerSDK \\ 1.18.4 此路徑為剛下載的 GStreamerSDK 位置 gradel.properties 畫面 中間會出現 Exception 錯誤 修改為 ->Exception 出現 GStreamer 未能使用,將 GStreamer.java 複製至專案內 複製位置,將所有 tutorials1-4 資料夾內都複製貼上 編譯完成顯示在實機上

IOS Swift 在某路徑下產生檔案 txt json

語法:         func createFile(name: String , fileBaseUrl: URL ){             let manager = FileManager . default                          let file = fileBaseUrl. appendingPathComponent (name)             print ( "文件: \ ( file )" )             let exist = manager. fileExists (atPath: file. path )             if !exist {                 let data = Data (base64Encoded: "aGVsbG8gd29ybGQ=" ,options:. ignoreUnknownCharacters )                 let createSuccess = manager. createFile (atPath: file. path ,contents:data,attributes: nil )                 print ( "文件產生结果: \ ( createSuccess )" )             }         }                  //新建test.txt文件         let manager = FileManager . default         let urlForDocument = manager. urls ( for: . documentDirectory ,                                            in:. userDomainMask )         let url = urlForDocument[ 0 ]         createFile (name: "projects/new1.

android holder.binding.videoview cannot be played Url

 Recently, Videoview was added to the implementation of RecyclerView, and there was a display error W/Glide: Cannot find GeneratedAppGlideModule. You should include the annotationProcessor compilation dependency on com.github.bumptech.glide:compiler and AppGlideModule in your application holder.binding.videoview.getLayoutParams().height = getScreenWidth (context) * 9 /16; holder.binding.videoview.getLayoutParams().width = getScreenHight (context) * 9 /16; public static int getScreenWidth(Context c) { int screenWidth = 0; // this is part of the class not the method if (screenWidth == 0) { WindowManager wm = (WindowManager) c.getSystemService(Context. WINDOW_SERVICE ); Display display = wm.getDefaultDisplay(); Point size = new Point(); display.getSize(size); screenWidth = size.x; } return screenWidth; } public static int getScreenHight(Context c) { int screenHeight = 0; // this is part of the class not the method if (screenH