Android 給自定義相冊(cè)中的文件添加"喜歡"標(biāo)記

如果開發(fā)一個(gè)自定義相冊(cè)功能. 一般而言,頂部會(huì)有3個(gè)tab,分別是"全部", "照片"和"視頻", 但是如果產(chǎn)品在文檔上隨手加上了一個(gè)"喜歡"列,就會(huì)非常的麻煩. 因?yàn)楦緵]法從媒體庫中獲取到類似這樣的一個(gè)字段.

解決思路

獲取媒體庫數(shù)據(jù), 肯定是用ContentResolver來操作的. 這個(gè)步驟就不提.
在debug查看了Cursor返回的所有數(shù)據(jù)列以后, 發(fā)現(xiàn)了一個(gè)字段tag, 他雖然不是我們要的favorite(喜歡)功能,但是可以用上.
就是將這個(gè)tag的值寫上我們自定義的一個(gè)值, 比如favorite, 然后下次查詢的時(shí)候, 直接查詢這個(gè)tag的值, 如果它的值為null就表示沒有被用戶點(diǎn)擊"喜歡", 如果等于我們自定義的字段favorite, 則表示被標(biāo)記了喜歡.

實(shí)現(xiàn)

我們先定義一個(gè)字段,用來標(biāo)記喜歡

public static final String TAG_FAVORITE = "favorite";

再假設(shè)有一個(gè)Model類代表我們的相冊(cè)類, 定義為Album, 然后結(jié)構(gòu)如下

public class Album  {
    public int id;
    public boolean favorite;
    public long addDate;
    public String path;
    public int width;
    public int height;
    public String mime;
    public long duration;
    public String displayName;
    public int orientation;
    public boolean isVideo;
    public boolean isChecked;

// .... 省略其他的equals, 序列化之類的代碼
}

接著就可以實(shí)現(xiàn)標(biāo)記為相冊(cè)為喜歡和不喜歡的方法了. 為了支持批量操作. 所以使用了applyBatch方法.

  /**
     * 標(biāo)記資源為[喜歡]或者移除此標(biāo)記
     *
     * @param albums 被操作的數(shù)據(jù)
     * @param favorite true標(biāo)記為喜歡, false清除標(biāo)記
     */
    public void markAlbumsFavorite(List<Album> albums, boolean favorite) {
        final Uri queryUri = MediaStore.Files.getContentUri("external");
        ContentResolver resolver = ContextProvider.get().getContext().getContentResolver();

        String selection = MediaStore.Files.FileColumns._ID + " = ?";
        ArrayList<ContentProviderOperation> operations =
                albums.stream()
                        .map(album ->
                                       ContentProviderOperation.newUpdate(queryUri)
                                                .withSelection(
                                                        selection,
                                                        new String[] {String.valueOf(album.id)})
                                                .withValue(
                                                        MediaStore.Video.VideoColumns.TAGS,
                                                        favorite ? TAG_FAVORITE : null)
                                                .build())
                        .collect(Collectors.toCollection(ArrayList::new));

        try {
            resolver.applyBatch(queryUri.getAuthority(), operations);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

里面使用了Java8的流式操作Stream, 如果看不懂, 我覺得可以學(xué)習(xí)一波這個(gè)東西. 學(xué)完了以后, 根本不想再用for循環(huán)了...

然后就是查詢的部分了.
在查詢數(shù)據(jù)的代碼中, 加上如下這么一段:

// ... 省略了查詢的字段設(shè)置等...
  Cursor cursor =
                context.getContentResolver()
                        .query(queryUri, projection, selection, selectionArgs, sortOrder + limit);

        if (cursor == null) {
            return new LinkedHashMap<>();
        }

        for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

            Album album = new Album();
            album.id = cursor.getInt(cursor.getColumnIndex(MediaStore.Files.FileColumns._ID));

            String favorite = null;
            try {
                // 個(gè)別手機(jī)在第一次設(shè)置tags之前獲取的話會(huì)出錯(cuò)
                favorite =
                        cursor.getString(cursor.getColumnIndex(MediaStore.Video.VideoColumns.TAGS));
            } catch (Exception ignored) {
            }
            album.favorite = TextUtils.equals(TAG_FAVORITE, favorite);

    // ... 省略后續(xù)的字段設(shè)置 ...
}

大概就是這樣.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市味廊,隨后出現(xiàn)的幾起案子癌刽,更是在濱河造成了極大的恐慌下面,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件区丑,死亡現(xiàn)場(chǎng)離奇詭異饭弓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叫潦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來官硝,“玉大人矗蕊,你說我怎么就攤上這事》涸矗” “怎么了拔妥?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵忿危,是天一觀的道長(zhǎng)达箍。 經(jīng)常有香客問我,道長(zhǎng)铺厨,這世上最難降的妖魔是什么缎玫? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮解滓,結(jié)果婚禮上赃磨,老公的妹妹穿的比我還像新娘。我一直安慰自己洼裤,他們只是感情好邻辉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腮鞍,像睡著了一般值骇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上移国,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天吱瘩,我揣著相機(jī)與錄音,去河邊找鬼迹缀。 笑死使碾,一個(gè)胖子當(dāng)著我的面吹牛蜜徽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播票摇,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拘鞋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了矢门?” 一聲冷哼從身側(cè)響起掐禁,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎颅和,沒想到半個(gè)月后傅事,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峡扩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年蹭越,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片教届。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡响鹃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出案训,到底是詐尸還是另有隱情买置,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布强霎,位于F島的核電站忿项,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏城舞。R本人自食惡果不足惜轩触,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望家夺。 院中可真熱鬧脱柱,春花似錦、人聲如沸拉馋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煌茴。三九已至随闺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間景馁,已是汗流浹背板壮。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留合住,地道東北人绰精。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓撒璧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親笨使。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卿樱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354