android升級到7.0后對權限又做了一個更新即不允許出現以file://的形式調用隱式APP,需要用共享文件的形式:content:// URI
因為系統相機是提供的共享 Provider ,
ContentValues contentValues = new ContentValues(1); contentValues.put(MediaStore.Images.Media.DATA, mTmpFile.getAbsolutePath()); Uri uri = getContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, REQUEST_CAMERA);
關於android7.0打開電筒時camera必須要設置預覽,否則燈光是無法打開的。
camera.setPreviewTexture(new SurfaceTexture(10));
系統權限更改
為了提高私有文件的安全性,面向 Android 7.0 或更高版本的應用私有目錄被限制訪問 (0700)。此設置可防止私有文件的元數據泄漏,如它們的大小或存在性。此權限更改有多重副作用:
- 私有文件的文件權限不應再由所有者放寬,為使用
MODE_WORLD_READABLE和/或MODE_WORLD_WRITEABLE而進行的此類嘗試將觸發SecurityException。注:迄今為止,這種限制尚不能完全執行。應用仍可能使用原生 API 或
FileAPI 來修改它們的私有目錄權限。但是,我們強烈反對放寬私有目錄的權限。 - 傳遞軟件包網域外的
file://URI 可能給接收器留下無法訪問的路徑。因此,嘗試傳遞file://URI 會觸發FileUriExposedException。分享私有文件內容的推薦方法是使用FileProvider。 DownloadManager不再按文件名分享私人存儲的文件。舊版應用在訪問COLUMN_LOCAL_FILENAME時可能出現無法訪問的路徑。面向 Android 7.0 或更高版本的應用在嘗試訪問COLUMN_LOCAL_FILENAME時會觸發SecurityException。通過使用DownloadManager.Request.setDestinationInExternalFilesDir()或DownloadManager.Request.setDestinationInExternalPublicDir()將下載位置設置為公共位置的舊版應用仍可以訪問COLUMN_LOCAL_FILENAME中的路徑,但是我們強烈反對使用這種方法。對於由DownloadManager公開的文件,首選的訪問方式是使用ContentResolver.openFileDescriptor()。
在應用間共享文件
對於面向 Android 7.0 的應用,Android 框架執行的 StrictMode API 政策禁止在您的應用外部公開 file:// URI。如果一項包含文件 URI 的 intent 離開您的應用,則應用出現故障,並出現 FileUriExposedException 異常。
要在應用間共享文件,您應發送一項 content:// URI,並授予 URI 臨時訪問權限。進行此授權的最簡單方式是使用 FileProvider 類。如需了解有關權限和共享文件的詳細信息,請參閱共享文件。
