編輯:關於Android編程
問題背景:
參考鏈接 做了一個圖片浏覽,用ContentResolver掃描圖庫照片,且嚴格按照時間拍攝順序排好序顯示在listview裡。如下圖所示:
遇到的問題是在4.2的手機上能正常顯示,但是新增了照片,這個掃描依舊麼變化。實在是惱火。另一個嚴重的問題是,在4.4的手機上,一張圖片都跑不起來。大爺的,真是坑爹到家了。浪費我好幾個小時,後來幾乎要放棄了,無意中浏覽自己以前寫的博客,才發現真正的原因是少了一個權限。
需要有以下兩個權限,才能在發廣播更新時起到作用。尤其是第二個權限,沒這個權限在4.2的手機上可以浏覽但不會更新,在4.4完全掃描不到圖片。但奇怪的是二種情況下都不會報異常。
查詢的關鍵語句是:
Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Log.i("yanguoqi", "mImageUri = " + mImageUri.getPath()); ContentResolver mContentResolver = MainActivity.this.getContentResolver(); //只查詢jpeg的圖片 Cursor mCursor = mContentResolver.query(mImageUri, null, MediaStore.Images.Media.MIME_TYPE + "=?", new String[] { "image/jpeg"}, MediaStore.Images.Media.DATE_TAKEN); mCursor.moveToLast(); int num = mCursor.getCount(); do{ //獲取圖片的路徑 String path = mCursor.getString(mCursor .getColumnIndex(MediaStore.Images.Media.DATA)); if(path.contains("/DCIM/Camera")){ imgPaths.add(path); } }while (mCursor.moveToPrevious()); mCursor.close();
2、所以為了過濾,只能掃描後通過if(path.contains("/DCIM/Camera"))這句話來過濾圖庫下面的文件;
3.為了實現嚴格按照拍照時間排序,光在查詢裡寫MediaStore.Images.Media.DATE_TAKEN還不中,這麼寫查出來的cursor第一個確實是最新的,但是通過List.add操作,反而把第一個排到最後了。因此我先將cursor移動最後,之所以do在前面while在後,是為了不漏掉第一個圖片。
4、每次查詢前,應該發廣播更新下:
private void updateGallery(){ Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); //, MediaStore.Images.Media.EXTERNAL_CONTENT_URI String path = Environment.getExternalStorageDirectory() + "/DCIM/Camera"; Uri uri = Uri.fromFile(new File(path)); intent.setData(uri); this.sendBroadcast(intent); }
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
。
ToggleButton可以認為是一個開關,每單擊依次一次在“開”和“關”之間進行切換。 ToggleButto
本文實例講述了Android編程實現自定義輸入法功能。分享給大家供大家參考,具體如下:對於Android用戶而言,一般都會使用第三方的輸入法。可是,在輸入密碼時(尤其是支
銀聯支付也是一般比較常用的支付功能,這裡簡單了介紹android app如果短期快速應用這一方面的東西。直接上代碼: 1.導入銀聯支付的依賴包: 2.在res目錄下增
前言 在自定義ViewGroup中,有時候需要實現觸摸事件攔截,比如ListView下拉刷新就是典型的觸摸事件攔截的例子。觸摸事件攔截就是在觸摸事件被parent vie