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 或
File
API 來修改它們的私有目錄權限。但是,我們強烈反對放寬私有目錄的權限。 - 傳遞軟件包網域外的
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
類。如需了解有關權限和共享文件的詳細信息,請參閱共享文件。