UWP開發之Template10實踐二:拍照功能你合理使用了嗎?(TempState臨時目錄問題)


最近在忙Asp.Net MVC開發一直沒空更新UWP這塊,不過有時間的話還是需要將自己的經驗和大家分享下,以求共同進步。

在上章【UWP開發之Template10實踐:本地文件與照相機文件操作的MVVM實例(圖文付原代碼)】已經談到了使用FileOpenPicker進行文件選擇,以及CameraCaptureUI進行拍照。

對於文件選擇一般進行如下設置就能實現:

// 選擇多個文件
                        FileOpenPicker openPicker = new FileOpenPicker();
                        openPicker.ViewMode = PickerViewMode.Thumbnail;
                        openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
                        openPicker.FileTypeFilter.Clear();
                        openPicker.FileTypeFilter.Add("*");
                        var files = await openPicker.PickMultipleFilesAsync();

對於拍照功能我想大家一般都只做到如下的設置:

// 拍照
                        CameraCaptureUI captureUI = new CameraCaptureUI();
                        captureUI.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Png;
                        captureUI.PhotoSettings.AllowCropping = false;
                        var photo = await captureUI.CaptureFileAsync(CameraCaptureUIMode.Photo);
                        if (photo != null)
                        {
                            // 文件操作(移動除外)
                        }

如果你只對照片進行了移動以外的操作,您的應用會隨着時間推移越來越占用空間?

因為拍照功能會緩存照片文件,如果應用退出時不做清理就很可能會一直留在TempState文件夾中,隨着時間推移積累的照片就會越來越多,同時這樣也容易導致應用泄密個人信息。

比如【UWP開發之Template10實踐:本地文件與照相機文件操作的MVVM實例(圖文付原代碼)】做的應用,現在去查看應用的TempState文件夾,拍的照片居然還在驚訝,很可怕對不對?

image

image

對於UWP的數據存儲有必要看看微軟的介紹:https://msdn.microsoft.com/zh-cn/library/windows/apps/hh464917

TempStaeLocalCache的區別:http://stackoverflow.com/questions/34046509/what-is-the-difference-and-similarity-if-any-between-localcache-and-tempstate

對於TempState臨時應用數據微軟的說法是:

臨時應用數據存儲類似於緩存。它的文件不會漫游,隨時可以刪除。系統維護任務可以隨時自動刪除存儲在此位置的數據。用戶還可以使用“磁盤清理”清除臨時數據存儲中的文件。 臨時應用數據可用於存儲應用會話期間的臨時信息。無法保證超出應用會話結束時間后仍將保留此數據,因為如有需要,系統可能回收已使用的空間。

---也就是說如果系統沒有及時清理,這個數據就一直存在(就如本人電腦的情況)!驚訝---正是由於這個原因才有必要手動做清除處理!

 

正確使用臨時目錄(拍照功能等):

大概步驟:應用啟動,清理臨時目錄(如果是從掛起恢復忽略此步),臨時目錄中文件操作(如啟動拍照等),應用退出,清理臨時目錄(如果應用掛起時忽略此步)

代碼如下:

           try
            {
                await ApplicationData.Current.ClearAsync(ApplicationDataLocality.Temporary);
            }
            catch
            {
                // 清理臨時目錄異常時不做任何處理
            }

代碼位置根據實際應用合理選擇!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM