SnapdragonGallery重命名功能详解

来源:互联网 发布:淘宝分享有礼的红包 编辑:程序博客网 时间:2024/06/14 07:45

 

    SnapdragonGallery重命名功能详解

1.   3590项目中骁龙图库,需要实现相册的重命名功能,要求选中系统相册是不显示重命名菜单,选中新建相册及存储卡内部新建相册时显示重命名菜单,具体实现如下。


Toobar中分为照片和相册两部分。

相册对应了AlbumPage.java

照片对应了TimeLinePage.java

长按相册之后的界面对应了AlbumSetPage.java

2.   operation.xml中新增重命名菜单


AlbumSetPage.java中onScrollPositionChanged方法中新增renameDialog case分支:


其中name参数为长按选中相册的名称

如何得到选中相册的名称呢?

在onlLongTap方法中新增如下代码:


If条件为是否单选相册,如果是单选,那么就从选中相册的path中获取选中相册的tab值(tab值为新建相册是赋予的一个值,从0累加),通过tab值获取MediaSet对象,然后通过getName方法拿到选中相册的名称。

长按相册之后,就进入了选择模式(此模式对应了AlbumSetPage.java类):


那么,怎么让单选相册的时候正确的传出选中相册的名称呢,

在onSingleTapUp方法中新增如下代码即可:


长按相册是不会调用此方法的,长按之后再次点击相册会调用此方法,每次抬起动作发生时都会去判断是否单选相册,如果不符合if条件,则不走此分支,这段代码的作用主要是用来更新name。例如:长按相册1,此时name为相册1的名称,再点击相册2,此时选中相册为1,2,再点击相册1,此时选中的相册为相册2,此时name的名称为相册2的名称。

3.   重命名相册

 

 

 

 

                                          

                                                      

 

 

 

 

 

 

 

 

单击重命名选项之后:


可以看到editText中text值为选中相册的名称。

重命名dialog调用了RenameDialog.java类,路径如下:


单击确定按钮之后执行代码:


首先判断重命名名称是否符合规定,符合规定之后会根据mrename建立一个File文件,之后根据mrename获取mNewBucketId,最后进行更新数据库操作。

这就完成了内部新建相册重命名的操作。

至于为什么要先新建文件,在更新数据库,最后重命名文件,这涉及到了新建相册的时候,会新建一个文件,然后将相册数据存储在数据库中,之后再每次更近界面的时候都会去查数据库,如果文件不存在的时候会把文件删掉,如下代码在MenuExecutor.java类中的execute(DataManagermanager,JobContext jc,int cmd,Path path)方法中:


4.   外部存储卡新建相册重命名失败

如果相册是从存储卡中新建的,那么重名会失败,我们可以添加如下代码来完善重命名的操作:


首先获取外部sd卡路径,之后new一个file对象,判断以moldname命名的相册文件是否存在,如果存在,更新文件名。最重要的一步是发送广播,这个广播会让sd中的文件刷新。

5.   重命名菜单的显示

根据需求,重命名菜单只有单选相册和单选非系统相册的时候才能出现,所以有了如下代码流程:
在AlbumSetPage.java类中的onLongTap方法中:


mActionModeHandler.updateSupportedOperation(name)方法,此方法只为传递name值,ActionModeHandler.java类中updateSupportedOperation()方法中有如下代码(updateSupportedOperation方法用来更新选中相册之后的操作菜单):


ComputeMenuOptions具体实现如下:

 

             会根据mname值来判断选中相册是否为系统相册,然后赋值给operation。

MediaObject.SUPPORT_RENAME在MediaObject.java类中,它的值如下:


骁龙相册中用二进制的值来规定可进行的操作,因为0~18已经被占用,所以我们新增19。

1<<19的意思是二进制的1左移19位,此时第19位是1,前18位都为0(从0开始计算)。

比如:

1<3,此时得出的值为1000;1000>2,得出的值为0010。

根据上述代码可以看到。如果是系统相册那么执行:


~MediaObject.SUPPORT_RENAME的值为第19位是0前18位都是1,然后和operation与一下,那么第19位一定是0其他位置的operation将保持不变,这就完成了系统相册下重命名菜单不显示,其他菜单照常显示。

如果是选中非系统相册:


Operation或上MediaObject.SUPPORT_RENAME。

此时第19位是1,所以重命名菜单显示,其他位置根据operation来定。

6.   根据operation更新操作菜单

ActionModeHandler.java类中updateSupportedOperation()方法内:


Operation作为参数传入updateMenu方法,方法体如下:


新增


这就完成了重命名菜单的显示与否问题。

 

 

 

 

原创粉丝点击