android 4.4kitkat 當執行到螢幕截圖功能時,app會當掉問題.
注意目前andorid 4.4 kitkat 當執行截圖時save到sd卡上:
會發生此問題:~~app會當掉
Android 4.4的sdcard根目錄的讀寫權限
所以你一截圖時save到sd卡上時,會發生更新圖庫的要求但因無權限所以app當掉.
(但圖片儲存到sd卡上是成功的,. )
故之前版本的android 可以run,但到4.4後就不行,
目前很多手機都逐漸更新成andorid 4.4.
所以不能因為說android 4.4 很少人用就不更新.
solution 1: 辦斷目前sdk版本並跳過此會當掉的code
圖片添加到SD卡上的文件夾。
由於圖片庫和文件夾對app來說是看不見的.
須透過MediaScannerConnection更新和顯示手機上的文件夾/圖片庫。
APP 如何使用媒體存儲服務(包含MediaScanner、MediaProvider以及媒體信息解析等部分),包括如何把 APP 新增或修改的文件更新到媒體數據庫、如何在多媒體應用中隱藏 APP 產生的文件、如何監聽媒體數據庫的變化等等。
Android 原生有一套媒體存儲服務 android.process.media,主要負責把磁碟中的文件保存到數據庫當中,供其他 APP 使用以及 MTP 模式使用。因此 APP 可以隨時快速查詢到機器上有多少音樂,音樂的長度、標題、作曲者、專輯封面都可以獲取到。
請參考:
以及
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
會發生此問題:~~app會當掉
java.lang.RuntimeException: Unable to start activity ComponentInfo{GalleryActivity}: java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=16890, uid=10218原因為:
Android 4.4的sdcard根目錄的讀寫權限
Intent.ACTION_MEDIA_MOUNTED
有更改.所以你一截圖時save到sd卡上時,會發生更新圖庫的要求但因無權限所以app當掉.
(但圖片儲存到sd卡上是成功的,. )
故之前版本的android 可以run,但到4.4後就不行,
目前很多手機都逐漸更新成andorid 4.4.
所以不能因為說android 4.4 很少人用就不更新.
solution 1: 辦斷目前sdk版本並跳過此會當掉的code
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)solution 2: 使用更新的方法:
{
// only for KITKAT and newer versions
}
else {
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + Environment.getExternalStorageDirectory())));
}
圖片添加到SD卡上的文件夾。
由於圖片庫和文件夾對app來說是看不見的.
須透過MediaScannerConnection更新和顯示手機上的文件夾/圖片庫。
APP 如何使用媒體存儲服務(包含MediaScanner、MediaProvider以及媒體信息解析等部分),包括如何把 APP 新增或修改的文件更新到媒體數據庫、如何在多媒體應用中隱藏 APP 產生的文件、如何監聽媒體數據庫的變化等等。
Android 原生有一套媒體存儲服務 android.process.media,主要負責把磁碟中的文件保存到數據庫當中,供其他 APP 使用以及 MTP 模式使用。因此 APP 可以隨時快速查詢到機器上有多少音樂,音樂的長度、標題、作曲者、專輯封面都可以獲取到。
請參考:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
{
// only for KITKAT and newer versions
MediaScannerConnection.scanFile(this,
new String[] { Uri.parse(mScreenshotPath).toString() }, null, null);
}
else
{
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse(mScreenshotPath)));
}
以及
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)即app不會當了.
{
// only for KITKAT and newer versions
MediaScannerConnection.scanFile(mContext, new String[] { Environment
.getExternalStorageDirectory().toString() }, null,
new MediaScannerConnection.OnScanCompletedListener()
{
public void onScanCompleted(String path, Uri uri)
{
Log.d("ExternalStorage", "Scanned " + path + ":");
Log.d("ExternalStorage", "uri=" + uri);
}
});
}
else
{
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
}
留言
張貼留言