android 4.4kitkat 當執行到螢幕截圖功能時,app會當掉問題.

注意目前andorid 4.4 kitkat 當執行截圖時save到sd卡上:
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)
 {
        // only for KITKAT and newer versions
}
else {
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
        Uri.parse("file://"  + Environment.getExternalStorageDirectory())));
}
solution 2: 使用更新的方法:

圖片添加到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)
                {
                    // 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())));
                }
即app不會當了.

留言

這個網誌中的熱門文章

最爛的銀行服務-玉山銀行

Mark App Design Apps - Terms and Privacy Policy (服務條款,隱私權政策)

SMR疊瓦式hdd致命缺陷被解決????!!!

ios app 上架時app icon要注意事項

更改google drive預設存放目錄位置Change Google Drive Default Folder Location in Windows

google play 正式發布前測試報告...非常好用.

舊有app在Android 12 閃退問題& app Splash screens

app bundle and bundletool. 關於aab安裝問題

關於google play console app應用程式簽署

Google Play badge徽章產生器