package com.wistron.WiGallery; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import com.wistron.StreamHelper.MPOFileStreamParser; import com.wistron.WiGallery.WiGalleryInterface.BatchProcessCallBack; import com.wistron.WiGallery.GEO.GEOCacheHelper; import com.wistron.WiGallery.GEO.GeoParser; import com.wistron.WiViewer.WiImageViewerActivity; import Utilities.*; import android.R.integer; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteBindOrColumnIndexOutOfRangeException; import android.database.sqlite.SQLiteException; import android.graphics.Bitmap; import android.graphics.BitmapFactory.Options; import android.media.ThumbnailUtils; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Handler; import android.os.Message; import android.provider.MediaStore; import android.provider.MediaStore.Video.Thumbnails; import android.util.Log; /** * Copyright (c) 2012 Wistron SWPC * All rights reserved. * @author Cocoonshu * @date 2012-02-23 12:00:00 * @comment * @purpose Provide Add/Delete/Modify/Select Operation on FileSystem * @detail */ public class AsyncFileProvider { protected static final String TAG = "AsyncFileProvider"; public static boolean CPU_DEBUG = false; public static boolean Thread_DEBUG = false; public static final int DELMODE_DATE = 0x0010; //删除模式:按日期删除 public static final int DELMODE_LOCA = 0x0011; //删除模式:按地区删除 public static final int CLEAR_DATABASE_ALL = 0x0012; //清空数据库:所有数据库 public static final int CLEAR_DATABASE_GEO = 0x0013; //清空数据库:地理信息数据库 public static final int CLEAR_DATABASE_FAVORITE = 0x0014; //清空数据库:喜好数据库 public boolean VIDEO_SERIVCE_CANCEL = false; //线程标识:视频伺服强制取消本次请求列表 public boolean VIDEO_SERIVCE_STOP = false; //线程标识:视频伺服强制停止 private Context mContext = null; private Thread mThrScanLib = null; //浏览媒体库线程 private Thread mThrScanGEO = null; //启动时扫描地理位置 private Thread mThrImageService = null; //图片加载伺服 private Thread mThrVideoService = null; //视频加载伺服 private Thread mThrGeoService = null; //获取地理信息服务 private Thread mThrFavoriteService = null; //喜好数据库扫描服务 private List<Element> mRequestImageList = null; private List<Element> mRequestVideoList = null; private List<ElementList> mSortedList = null; //地理位置排序临时表 private OnDataScanCompletedListener mOnDataScanCompletedListener = null; public AsyncFileProvider(Context context) { mContext = context; mRequestImageList = new ArrayList<Element>(); mRequestVideoList = new ArrayList<Element>(); } /** * 扫描系统媒体库 */ public void scanMediaLib(){ mThrScanLib = new Thread(initScanLib()); mThrScanLib.setName("mThrScanLib"); mThrScanLib.start(); } @Deprecated public void scanMediaLib(String rootDir){ mThrScanLib = new Thread(initScanLib()); mThrScanLib.setName("mThrScanLib(String rootDir"); mThrScanLib.start(); } /** * 扫描全部GEO信息 */ public void scanGEOLib(){ mThrScanGEO = new Thread(initScanGEOLib(null, 0)); mThrScanGEO.setName("mThrScanGEO"); mThrScanGEO.start(); } /** * 扫描全部GEO信息 * @param processHandler 发送回调时应被调用的Handler * @param msgWhat 发送回调时送出的信息标识 */ public void scanGEOLib(Handler processHandler, int msgWhat){ mThrScanGEO = new Thread(initScanGEOLib(processHandler, msgWhat)); mThrScanGEO.setName("mThrScanGEO"); mThrScanGEO.start(); } /** * 启动图片加载伺服 */ public void launchImageLoadService(){ if(mThrImageService == null){ mThrImageService = new Thread(imageLoadService()); mThrImageService.setName("mThrImageService"); } if(!mThrImageService.isAlive()){ try{ mThrImageService.start(); }catch (IllegalThreadStateException exp) { //不做其余操作 stopImageLoadService(); launchImageLoadService(); } } } /** * 启动视频加载伺服 */ public void launchVideoLoadService(){ if(mThrVideoService == null){ mThrVideoService = new Thread(videoLoadService()); mThrVideoService.setName("mThrVideoService"); } if(!mThrVideoService.isAlive()){ try{ mThrVideoService.start(); }catch (IllegalThreadStateException exp) { //不做其余操作 } } } /** * 启动地理位置排序服务 */ public void launchParserGeoService(List<ElementList> list,CSStaticData.LIST_TYPE type){ if (mThrGeoService == null) { mThrGeoService = new Thread(parserGeoService(list,type)); mThrGeoService.setName("mThrGeoService"); } if(!mThrGeoService.isAlive()){ mThrGeoService.start(); } } /** * 启动喜好数据库扫描服务 */ public void launchScanFavoriteDBSerivce(){ if(mThrFavoriteService == null){ mThrFavoriteService = new Thread(scanFavoriteDBRunnable()); mThrFavoriteService.setName("mThrFavoriteService"); } if(!mThrFavoriteService.isAlive()){ mThrFavoriteService.start(); } } /** * 中断图片加载伺服 */ public void interruptImageLoadService(){ if(mThrImageService != null && mThrImageService.isAlive()){ mThrImageService.interrupt(); try{ // mThrImageService.stop(); }catch (UnsupportedOperationException exp) { exp.printStackTrace(); } } } /** * 中断视频加载伺服 */ public void interruptVideoLoadService(){ if(mThrVideoService != null && mThrVideoService.isAlive()){ mThrVideoService.interrupt(); try{ // mThrVideoService.stop(); }catch (UnsupportedOperationException exp) { exp.printStackTrace(); } } } /** * 中断地理位置排序伺服 */ public void interruptParserGeoService(){ if(mThrGeoService != null && mThrGeoService.isAlive()){ mThrGeoService.interrupt(); try{ // mThrGeoServivce.stop(); }catch (UnsupportedOperationException exp) { exp.printStackTrace(); } mThrGeoService = null; //使下次能快速启动这个排序伺服 } } /** * 中断选择模式恢复服务 */ public void interruptSelectionModeRecoverySerivce(){ } /** * 停止图片加载伺服 */ public void stopImageLoadService(){ interruptImageLoadService(); if(mThrVideoService != null){ try { mThrVideoService.stop(); mThrVideoService = null; System.gc(); } catch (UnsupportedOperationException exp) { mThrVideoService = null; } } } /** * 停止视频加载伺服 */ public void stopVideoLoadService(){ interruptVideoLoadService(); if(mThrImageService != null){ try{ mThrImageService.stop(); mThrImageService = null; System.gc(); } catch (UnsupportedOperationException exp) { mThrImageService = null; } } } /** * 停止地理位置排序伺服 */ public void stopParserGeoService(){ interruptParserGeoService(); if(mThrGeoService != null){ try{ mThrGeoService.stop(); mThrGeoService = null; System.gc(); } catch (UnsupportedOperationException exp) { mThrGeoService = null; } } } /** * 停止选择模式恢复服务 */ public void stopSelectionModeRecoverySerivce(){ } /** * 重命名文件 * 不支持通配符 * @param resFileName [drive:][path]filename 原文件 * @param desFileName filename 目标文件名 * @return 是否操作成功 */ public boolean rename(String resFileName, String desFileName){ return false; } /** * 删除文件 * @param fileList 要删除的文件列表 * @param afterExit 是否在退出后才执行 * @return */ public boolean deteleFiles(List<String> fileList, boolean afterExit, boolean ignoreOpenGL, int owner){ Thread mThrDelService = new Thread(deleteFilesRunnable(fileList, afterExit, ignoreOpenGL, owner)); mThrDelService.setName("mThrDelService"); mThrDelService.start(); return false; } /** * 编辑文件 * @param editFileName */ public synchronized void editFile(String editFileName){ if(WiGalleryOpenGLRenderer.m_data_manager != null){ Element elem = WiGalleryOpenGLRenderer.m_data_manager.Get(editFileName); if(elem != null){ WiGalleryOpenGLRenderer.m_data_manager.setRequestLoadFileList(elem); } } } /** * 移动文件,每次调用都会新启线程,且操作不可取消 * @param fileList 待移动的文件 * @param desDir 目标目录 */ public void moveTo(List<String> fileList, String desDir, boolean ignoreOpenGL, int owner) { Thread thrMoveFiles = new Thread(moveFilesRunnable(fileList, desDir, ignoreOpenGL, owner)); thrMoveFiles.setName("thrMoveFiles"); thrMoveFiles.start(); } /** * 检查WIFI的连通性 */ public void checkWifiConnection(){ Thread thrWifiCheck = new Thread(checkInternetRunnable()); thrWifiCheck.setName("thrWIFICheck"); thrWifiCheck.start(); } /** * 把选中的文件添加到喜好数据库中 * @param fileName */ public void setFavoriteToDB(List<String> fileName, int owner){ Thread thrSetFavorite = new Thread(setFavoriteToDBRunnable(fileName, owner)); thrSetFavorite.setName("thrSetFavorite"); thrSetFavorite.start(); } /** * 把指定的文件从喜好数据库中移除 * @param fileName */ public void removeFavoriteFromDB(List<String> fileName, int owner){ Thread thrRemoveFavorite = new Thread(removeFavoriteFromDBRunnable(fileName, owner)); thrRemoveFavorite.setName("thrRemoveFavorite"); thrRemoveFavorite.start(); } /** * 向Gallery中添加一个文件 * @param file */ public void addNewFile(String file){ File fin = null; Element fileElem = null; String date = ""; Calendar calendar = Calendar.getInstance(); CSStaticData.MEDIA_TYPE mediaType = CSStaticData.MEDIA_TYPE.NORMAL_IMAGE; if(file == null || file.equals("")){ return; } //解析文件 fin = new File(file); if(!fin.exists() || !fin.isFile()){ return; } if(!FileTypeHelper.isSupportedFile(file)){ return; } calendar.setTimeInMillis(fin.lastModified()); //解析为Element if(FileTypeHelper.isImageFile(file)){ if(FileTypeHelper.isStereoImageFile(file)){ mediaType = CSStaticData.MEDIA_TYPE.STOERE_IMAGE; }else{ mediaType = CSStaticData.MEDIA_TYPE.NORMAL_IMAGE; } } if(FileTypeHelper.isVideoFile(file)){ if(FileTypeHelper.isStereoVideoFile(file)){ mediaType = CSStaticData.MEDIA_TYPE.STOERE_VIDEO; }else{ mediaType = CSStaticData.MEDIA_TYPE.NORMAL_VIDEO; } } fileElem = new Element(mediaType, 0, 0, CSStaticData.choosedTextureID, CSStaticData.notChoosedTextureID, file, String.format("%04d %02d %02d %02d %02d %02d", calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND)), Double.NaN, Double.NaN); //添加到主文件列表 if(WiGalleryOpenGLRenderer.m_data_manager != null){ WiGalleryOpenGLRenderer.m_data_manager.Add(fileElem); } } /** * 强制停止视频伺服 */ public void forceStopVideoSerivce(){ VIDEO_SERIVCE_STOP = true; } /** * 忽略一次视频缩图请求 * 这会取消掉本次视频缩图请求中的所有请求文件 */ public void ignoreVideoRequestSerivceOnce(){ VIDEO_SERIVCE_CANCEL = true; } /***********************************************/ /* 内部方法 */ /***********************************************/ /** * 生成扫描系统媒体数据库的方法 * @return */ private Runnable initScanLib() { Runnable runnable = new Runnable() { long lStart = 0, //Load起始时间 lEnd = 0; //Load结束时间 int lCount = 0; //记录数量 @Override public void run() { lStart = System.currentTimeMillis(); String[] imageColumnsStr = { //图片待查字段 MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.DATE_MODIFIED, MediaStore.Images.Media.LATITUDE, MediaStore.Images.Media.LONGITUDE, MediaStore.Images.Media.MIME_TYPE }, videoColumnsStr = { //视频待查字段 MediaStore.Video.Media._ID, MediaStore.Video.Media.DATA, MediaStore.Video.Media.DISPLAY_NAME, MediaStore.Video.Media.DATE_MODIFIED, MediaStore.Video.Media.LATITUDE, MediaStore.Video.Media.LONGITUDE, MediaStore.Video.Media.MIME_TYPE }; String imageWhereStr = MediaStore.Images.Media.DATA + " LIKE ?", //图片待查条件 videoWhereStr = MediaStore.Video.Media.DATA + " LIKE ?"; //视频待查条件 String[] imageWhereArg = new String[]{CSStaticData.TMP_DIR + "%"}, videoWhereArg = new String[]{CSStaticData.TMP_DIR + "%"}; if(CSStaticData.DEMO){ // imageWhereArg = CSStaticData.MEDIA_SCAN_DIR; // for(int i = 0; i < CSStaticData.MEDIA_SCAN_DIR.length; i++){ // imageWhereArg[i] = imageWhereArg[i] + "%"; // } // if(imageWhereArg[CSStaticData.MEDIA_SCAN_DIR.length - 1].length() >= 4){ // imageWhereArg[CSStaticData.MEDIA_SCAN_DIR.length - 1] // = imageWhereArg[CSStaticData.MEDIA_SCAN_DIR.length - 1] // .substring(0, imageWhereArg[CSStaticData.MEDIA_SCAN_DIR.length - 1].length() - 4); // } // videoWhereArg = imageWhereArg; imageWhereStr = MediaStore.Images.Media.DATA + " LIKE ? OR " + MediaStore.Images.Media.DATA + " LIKE ?"; videoWhereStr = MediaStore.Video.Media.DATA + " LIKE ? OR " + MediaStore.Video.Media.DATA + " LIKE ?"; imageWhereArg = new String[]{CSStaticData.TMP_INT_DIR + "%", CSStaticData.TMP_EXT_DIR + "%"}; videoWhereArg = new String[]{CSStaticData.TMP_INT_DIR + "%", CSStaticData.TMP_EXT_DIR + "%"}; } CSStaticData.LOAD_COMPLETED = false; CSStaticData.LOAD_STARTED = true; if(CSStaticData.DEMO){ if(WiGalleryOpenGLRenderer.m_data_manager != null && WiGalleryOpenGLRenderer.m_data_manager.Size() > 0){ if(WiGalleryOpenGLRenderer.m_on_data_list_listener != null){ WiGalleryOpenGLRenderer.m_on_data_list_listener.onDataFillCompleted(); }else{ Log.w(TAG, "[scanMediaLib]render is null"); } if(mOnDataScanCompletedListener != null){ mOnDataScanCompletedListener.onDataScanCompletedListener(); } CSStaticData.LOAD_COMPLETED = true; CSStaticData.LOAD_STARTED = false; setFavoriteSettingToMainList(); return; } } String imageOrderStr = MediaStore.Images.Media.DATE_MODIFIED + " DESC", //图片排序方式 videoOrderStr = MediaStore.Video.Media.DATE_MODIFIED + " DESC"; //视频排序方式 CSStaticData.MEDIA_TYPE mediaType = CSStaticData.MEDIA_TYPE.NORMAL_IMAGE; Element fileElem = null; Cursor cursor = null; ContentResolver resolver = null; Calendar calendar = Calendar.getInstance(); if(mContext == null){ return; } /* [按日期降序查询相关路径下的文件] * SELECT _data, _display, date_modified, latitude, longitude * FROM MeidaStore.tab * WHERE _data = '?%' * ORDER BY date_modified DESC */ resolver = mContext.getContentResolver(); //扫描图片数据库 { //内部存储器 try{ //清空主链表 WiGalleryOpenGLRenderer.m_data_manager.clearMainList(); cursor = resolver.query(MediaStore.Images.Media.INTERNAL_CONTENT_URI, imageColumnsStr, imageWhereStr, imageWhereArg, imageOrderStr); if(CSStaticData.DEBUG){ int count = 0; String colset = ""; if(cursor != null){ count = cursor.getCount(); lCount += count; for (int i = 0; i < cursor.getColumnNames().length; i++) { colset += cursor.getColumnNames()[i] + " "; } Log.w(TAG,"[scanMediaLib][Inner Image]记录数:" + count); Log.w(TAG,"[scanMediaLib][Inner Image]字段集:" + colset); } } if(cursor != null && cursor.moveToFirst()){ do{ if(FileTypeHelper.isStereoImageFile(cursor.getString(1))){ mediaType = CSStaticData.MEDIA_TYPE.STOERE_IMAGE; }else{ mediaType = CSStaticData.MEDIA_TYPE.NORMAL_IMAGE; } calendar.setTimeInMillis(cursor.getInt(3) * 1000L); //getInt(2)的结果是秒,所以乘以1000换算成毫秒 Double[] gps = new Double[]{cursor.getDouble(4), cursor.getDouble(5)}; if(gps[0] == 0.0f){ gps[0] = Double.NaN; } if(gps[1] == 0.0f){ gps[1] = Double.NaN; } fileElem = new Element(mediaType, //FileType 0, //LeftImageTextureID 0, //RightImageTextureID CSStaticData.choosedTextureID, //ChoosedTextureID CSStaticData.notChoosedTextureID, //notChoosedTextureID cursor.getString(1), //File Path String.format("%04d %02d %02d %02d %02d %02d", calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND)), //Date Modified gps[0], //Latitude gps[1]); //Longitude fileElem.m_id = cursor.getLong(0); //ID WiGalleryOpenGLRenderer.m_data_manager.Add(fileElem); if(CSStaticData.DEBUG){ Log.w(TAG,"[scanMediaLib][Inner Image]" + cursor.getString(1) + ", " + String.valueOf(cursor.getInt(3)) + ", " + gps[0] + ", " + gps[1]); } }while(cursor.moveToNext()); cursor.close(); } }catch (SQLiteBindOrColumnIndexOutOfRangeException e) { e.printStackTrace(); }catch (SQLiteException e) { e.printStackTrace(); } //外部存储器 try{ cursor = resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumnsStr, imageWhereStr, imageWhereArg, imageOrderStr); if(CSStaticData.DEBUG){ int count = 0; String colset = ""; if(cursor != null){ count = cursor.getCount(); lCount += count; for (int i = 0; i < cursor.getColumnNames().length; i++) { colset += cursor.getColumnNames()[i] + " "; } Log.w(TAG,"[scanMediaLib][Outter Image]记录数:" + count); Log.w(TAG,"[scanMediaLib][Outter Image]字段集:" + colset); } } if(cursor != null && cursor.moveToFirst()){ do{ if(FileTypeHelper.isStereoImageFile(cursor.getString(1))){ mediaType = CSStaticData.MEDIA_TYPE.STOERE_IMAGE; }else{ mediaType = CSStaticData.MEDIA_TYPE.NORMAL_IMAGE; } calendar.setTimeInMillis(cursor.getInt(3) * 1000L); Double[] gps = new Double[]{cursor.getDouble(4), cursor.getDouble(5)}; if(gps[0] == 0.0f){ gps[0] = Double.NaN; } if(gps[1] == 0.0f){ gps[1] = Double.NaN; } fileElem = new Element(mediaType, 0, 0, CSStaticData.choosedTextureID, CSStaticData.notChoosedTextureID, cursor.getString(1), String.format("%04d %02d %02d %02d %02d %02d", calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND)), gps[0], gps[1]); fileElem.m_id = cursor.getLong(0); WiGalleryOpenGLRenderer.m_data_manager.Add(fileElem); if(CSStaticData.DEBUG){ Log.w(TAG,"[scanMediaLib][Outter Image]" + cursor.getString(1) + ", " + String.valueOf(cursor.getInt(3)) + ", " + gps[0] + ", " + gps[1]); } }while(cursor.moveToNext()); cursor.close(); } }catch (SQLiteBindOrColumnIndexOutOfRangeException e) { e.printStackTrace(); }catch (SQLiteException e) { e.printStackTrace(); } } //扫描视频数据库 { //内部存储器 try{ cursor = resolver.query(MediaStore.Video.Media.INTERNAL_CONTENT_URI, videoColumnsStr, videoWhereStr, videoWhereArg, videoOrderStr); if(CSStaticData.DEBUG){ int count = 0; if(cursor != null){ count = cursor.getCount(); lCount += count; Log.w(TAG,"[scanMediaLib][Inner Video]记录数:" + count); Log.w(TAG,"[scanMediaLib][Inner Video]字段集:" + cursor.getColumnNames()); } } if(cursor != null && cursor.moveToFirst()){ do{ if(FileTypeHelper.isStereoVideoFile(cursor.getString(6))){ mediaType = CSStaticData.MEDIA_TYPE.STOERE_VIDEO; }else{ mediaType = CSStaticData.MEDIA_TYPE.NORMAL_VIDEO; } calendar.setTimeInMillis(cursor.getInt(3) * 1000L); Double[] gps = new Double[]{cursor.getDouble(4), cursor.getDouble(5)}; if(gps[0] == 0.0f){ gps[0] = Double.NaN; } if(gps[1] == 0.0f){ gps[1] = Double.NaN; } fileElem = new Element(mediaType, 0, 0, CSStaticData.choosedTextureID, CSStaticData.notChoosedTextureID, cursor.getString(1), String.format("%04d %02d %02d %02d %02d %02d", calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND)), gps[0], gps[1]); fileElem.m_id = cursor.getLong(0); WiGalleryOpenGLRenderer.m_data_manager.Add(fileElem); if(CSStaticData.DEBUG){ Log.w(TAG,"[scanMediaLib][Inner Video]" + cursor.getString(1) + ", " + String.valueOf(cursor.getInt(3)) + ", " + gps[0] + ", " + gps[1]); } }while(cursor.moveToNext()); cursor.close(); } }catch (SQLiteBindOrColumnIndexOutOfRangeException e) { e.printStackTrace(); }catch (SQLiteException e) { e.printStackTrace(); } //外部存储器 try{ cursor = resolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videoColumnsStr, videoWhereStr, videoWhereArg, videoOrderStr); if(CSStaticData.DEBUG){ int count = 0; if(cursor != null){ count = cursor.getCount(); lCount += count; Log.w(TAG,"[scanMediaLib][Outter Video]记录数:" + count); Log.w(TAG,"[scanMediaLib][Outter Video]字段集:" + cursor.getColumnNames()); } } if(cursor != null && cursor.moveToFirst()){ do{ if(FileTypeHelper.isStereoVideoFile(cursor.getString(6))){ mediaType = CSStaticData.MEDIA_TYPE.STOERE_VIDEO; }else{ mediaType = CSStaticData.MEDIA_TYPE.NORMAL_VIDEO; } calendar.setTimeInMillis(cursor.getInt(3) * 1000L); Double[] gps = new Double[]{cursor.getDouble(4), cursor.getDouble(5)}; if(gps[0] == 0.0f){ gps[0] = Double.NaN; } if(gps[1] == 0.0f){ gps[1] = Double.NaN; } fileElem = new Element(mediaType, 0, 0, CSStaticData.choosedTextureID, CSStaticData.notChoosedTextureID, cursor.getString(1), String.format("%04d %02d %02d %02d %02d %02d", calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1, calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND)), gps[0], gps[1]); fileElem.m_id = cursor.getLong(0); WiGalleryOpenGLRenderer.m_data_manager.Add(fileElem); if(CSStaticData.DEBUG){ Log.w(TAG,"[scanMediaLib][Outter Video]" + cursor.getString(1) + ", " + String.valueOf(cursor.getInt(3)) + ", " + gps[0] + ", " + gps[1]); } }while(cursor.moveToNext()); cursor.close(); } }catch (SQLiteBindOrColumnIndexOutOfRangeException e) { e.printStackTrace(); }catch (SQLiteException e) { e.printStackTrace(); } } //排序主链表 if(CSStaticData.DEBUG){ Log.w(TAG, "[initScanLib]文件加载完毕,开始排序"); } WiGalleryOpenGLRenderer.m_data_manager.sortMainList(CSStaticData.g_sort_order_mode); lEnd = System.currentTimeMillis(); if(CSStaticData.DEBUG){ Log.w(TAG, "[scanMediaLib]Load Time = " + (lEnd - lStart) + " ms"); Log.w(TAG, "[scanMediaLib]Load Records = " + lCount); } //发送完毕回调 if(WiGalleryOpenGLRenderer.m_on_data_list_listener != null){ WiGalleryOpenGLRenderer.m_on_data_list_listener.onDataFillCompleted(); }else{ Log.w(TAG, "[scanMediaLib]render is null"); } if(mOnDataScanCompletedListener != null){ mOnDataScanCompletedListener.onDataScanCompletedListener(); } CSStaticData.LOAD_COMPLETED = true; CSStaticData.LOAD_STARTED = false; if(CSStaticData.DEBUG){ Log.w(TAG, "[scanMediaLib]开始扫描GEO信息"); } WiGalleryOpenGLRenderer.mAsyncFileProvider.scanGEOLib(); //根据数据库设置文件喜好 if(CSStaticData.DEBUG){ Log.w(TAG, "[initScanLib]文件排序完毕,开始加载喜好设置"); } setFavoriteSettingToMainList(); if(CSStaticData.DEBUG){ Log.w(TAG, "[initScanLib]喜好设置加载完毕"); } } }; return runnable; } /** * 扫描全部文件地理信息的方法 * @return */ private Runnable initScanGEOLib(final Handler processHandler, final int msgWhat){ Runnable runnable = new Runnable() { int curPtr = 0; //当前进度 int tolPtr = 0; //总进度 int batchNum = 50; //一批查询的数量 boolean mKeepGetting = true; List<Element> mSysMainList = new ArrayList<Element>(); //批量处理链表 List<Element> mResultList = null; @Override public void run() { {//方法体 //等待数据加载完毕 while(!CSStaticData.LOAD_COMPLETED){ try { Thread.sleep(100); } catch (InterruptedException exp) { exp.printStackTrace(); } } //开始查询, 50个一批的查询,以提高查询效率 while(mKeepGetting){ int startPtr = 0, endPtr = 0; if(mSysMainList == null){ mSysMainList = new ArrayList<Element>(); } mSysMainList.clear(); tolPtr = WiGalleryOpenGLRenderer.m_data_manager.getMainListSize(); //随时监控,随时改变 startPtr = curPtr; if(curPtr < tolPtr){ for(int i = 0; i < batchNum; i++){ //tolPtr = WiGalleryOpenGLRenderer.m_data_manager.getMainListSize(); //随时监控,随时改变 if(curPtr < tolPtr){ mSysMainList.add(WiGalleryOpenGLRenderer.m_data_manager.Get(i)); curPtr ++; }else{ mKeepGetting = false; break; } } endPtr = curPtr; //查询并回调 mResultList = GeoParser.parserGeoBatch(mContext, mSysMainList, CSStaticData.LIST_TYPE.LIST_LOCATION_4, new BatchProcessCallBack() { @Override public void startProcess(int process, int max) { if(processHandler != null){ Message msg = new Message(); msg.what = msgWhat; msg.arg1 = process; processHandler.sendMessage(msg); } } @Override public void inProcess(int process, int max) { if(processHandler != null){ Message msg = new Message(); msg.what = msgWhat; msg.arg1 = process; processHandler.sendMessage(msg); } } @Override public void endProcess(int process, int max) { if(processHandler != null){ Message msg = new Message(); msg.what = msgWhat; msg.arg1 = process; processHandler.sendMessage(msg); } } }); //回执给主链表 for(int i = 0; i < batchNum; i++){ if(i + startPtr < endPtr){ WiGalleryOpenGLRenderer.m_data_manager.Get(i+startPtr).m_str_address = mResultList.get(i).m_str_address; }else{ break; } } } } } Log.e("GEOCacheHelper", "GPS(29.7123, 107.4090) = " + GeoParser.parserGeo(mContext, 29.7123, 107.4090, CSStaticData.LIST_TYPE.LIST_LOCATION_4)); Log.e("GEOCacheHelper", "GPS(30.5833, 114.3000) = " + GeoParser.parserGeo(mContext, 30.5833, 114.3000, CSStaticData.LIST_TYPE.LIST_LOCATION_4)); Log.e("GEOCacheHelper", "GPS(45.4166, 75.7166) = " + GeoParser.parserGeo(mContext, 45.4166, 75.7166, CSStaticData.LIST_TYPE.LIST_LOCATION_4)); Log.e("GEOCacheHelper", "GPS(25.0333, 121.6333) = " + GeoParser.parserGeo(mContext, 25.0333, 121.6333, CSStaticData.LIST_TYPE.LIST_LOCATION_4)); } }; return runnable; } /** * 图片缩略图加载线程的方法 * @return */ private Runnable imageLoadService(){ Runnable runnable = new Runnable() { long sleepMsec = 0; int sleepNsec = 0; List<Element> requestList = null; Options options = new Options(); boolean keepRuning = true; Bitmap[] srcBmp = new Bitmap[2]; @Override public void run() { if(CSStaticData.DEBUG){ Log.w(TAG, "[ImageLoadService]图片贴图加载私服启动"); } options.outWidth = CSStaticData.THUMB_SIZE; options.outHeight = CSStaticData.THUMB_SIZE; mRequestImageList = new ArrayList<Element>(); while(keepRuning){ {//线程控制区间 if(Thread.interrupted()){ keepRuning = false; } } {//执行区间 try { if(CPU_DEBUG && CSStaticData.DEBUG){ Log.w("CPU_Trace", "Wicamera3D II CPU: " + Integer.valueOf(SystemInfo.getCpuWithApplicationName("com.wistron.swpc.wicamera3dii")) + "%"); } // 读取请求列表 if(WiGalleryOpenGLRenderer.m_data_manager == null){ Thread.sleep(sleepMsec, sleepNsec); if(CSStaticData.DEBUG && Thread_DEBUG){ Log.w(TAG, "[ImageLoadService]等待主数据列表创建,线程已休眠: " + sleepMsec + "ms, " + sleepNsec + "ns" ); } continue; } splitRequestFileList(WiGalleryOpenGLRenderer.m_data_manager.getRequestLoadFileList()); if(requestList != null) requestList.clear(); requestList = new ArrayList<Element>(mRequestImageList); mRequestImageList.clear(); // 搜索文件 int requestListSize = requestList.size(); if(requestListSize == 0){ sleepMsec = 50; sleepNsec = 0; }else{ sleepMsec = 0; sleepNsec = 0; } for (int i = 0; i < requestListSize; i++) { Element requestListItem = requestList.get(i); if(requestListItem == null){ continue; } String requestListItemName = requestListItem.getName(); File file = new File(requestListItemName.toString()); if (FileTypeHelper.getFileType(requestListItemName.toString()) == FileTypeHelper.TYPE_IMAGE_2D) { if(!file.exists()){ if(CSStaticData.DEBUG){ Log.w(TAG, "[ImageLoadService]追加文件贴图: " + requestListItemName.toString() + "失败,文件不存在!"); } continue; } if(CSStaticData.THUMB_FROM_MEDIA_DB){ srcBmp[0] = android.provider.MediaStore.Images.Thumbnails.getThumbnail(mContext.getContentResolver(), requestListItem.m_id, android.provider.MediaStore.Images.Thumbnails.MINI_KIND, options); }else{ srcBmp[0] = FileOperation.fitSizeImg( requestListItemName.toString(), CSStaticData.THUMB_SIZE); } if(srcBmp[0] != null){ try{ srcBmp[0] = FileOperation.cutBitmapWithProportion(srcBmp[0], CSStaticData.THUMB_SIZE, CSStaticData.THUMB_SIZE, true); if(CSStaticData.ENABLE_THUMB_ROTATE){ srcBmp[0] = FileOperation.ratoteBitmapWithExifTag(srcBmp[0], requestListItemName); } }catch(Exception exp){ exp.printStackTrace(); srcBmp[1] = srcBmp[0] = null; }catch (Error exp) { exp.printStackTrace(); srcBmp[1] = srcBmp[0] = null; } srcBmp[1] = null; }else{ srcBmp[1] = srcBmp[0] = null; } if (requestListItem != null) { requestListItem.setBitmap(srcBmp[0], null); WiGalleryOpenGLRenderer.m_data_manager.AddNeedLoadTextureFile(requestListItem); if(CSStaticData.DEBUG){ if(srcBmp[0] != null){ Log.w(TAG, "[ImageLoadService]追加文件贴图: " + requestListItemName.toString()); }else{ Log.w(TAG, "[ImageLoadService]文件贴图: " + requestListItemName.toString() + "加载失败"); } } } } if (FileTypeHelper.getFileType(requestListItemName.toString()) == FileTypeHelper.TYPE_IMAGE_3DJ) { if(!file.exists()){ if(CSStaticData.DEBUG){ Log.w(TAG, "[ImageLoadService]追加文件贴图: " + requestListItemName.toString() + "失败,文件不存在!"); } continue; } try{ if(CSStaticData.THUMB_FROM_MEDIA_DB){ srcBmp[0] = android.provider.MediaStore.Images.Thumbnails.getThumbnail(mContext.getContentResolver(), requestListItem.m_id, android.provider.MediaStore.Images.Thumbnails.MINI_KIND, options); }else{ srcBmp[0] = FileOperation.fitSizeImg( requestListItemName.toString(), CSStaticData.THUMB_SIZE); } if(CSStaticData.ENABLE_THUMB_ROTATE){ srcBmp[0] = FileOperation.ratoteBitmapWithExifTag(srcBmp[0], requestListItemName); } srcBmp = FileTypeHelper.image3DTo2D( srcBmp[0], CSStaticData.THUMB_SIZE, CSStaticData.THUMB_SIZE); }catch (Exception exp) { exp.printStackTrace(); srcBmp[1] = srcBmp[0] = null; }catch (Error exp) { exp.printStackTrace(); srcBmp[1] = srcBmp[0] = null; } if (requestListItem != null) { requestListItem.setBitmap(srcBmp[0], srcBmp[1]); WiGalleryOpenGLRenderer.m_data_manager.AddNeedLoadTextureFile(requestListItem); if(CSStaticData.DEBUG){ if(srcBmp[0] != null && srcBmp[1] != null){ Log.w(TAG, "[ImageLoadService]追加文件贴图: " + requestListItemName.toString()); }else if(srcBmp[0] == null && srcBmp[1] == null){ Log.w(TAG, "[ImageLoadService]文件贴图: " + requestListItemName.toString() + "加载失败"); }else{ Log.w(TAG, "[ImageLoadService]文件贴图: " + requestListItemName.toString() + "部分加载成功"); } } } } if (FileTypeHelper.getFileType(requestListItemName.toString()) == FileTypeHelper.TYPE_IMAGE_3DS) { if(!file.exists()){ if(CSStaticData.DEBUG){ Log.w(TAG, "[ImageLoadService]追加文件贴图: " + requestListItemName.toString() + "失败,文件不存在!"); } continue; } try{ srcBmp = MPOFileStreamParser.decodeFile(requestListItemName.toString(), options); srcBmp = FileTypeHelper.scaleMPOImage(srcBmp, CSStaticData.THUMB_SIZE, CSStaticData.THUMB_SIZE); if(CSStaticData.ENABLE_THUMB_ROTATE){ srcBmp = FileOperation.ratoteBitmapWithExifTag(srcBmp, requestListItemName); } }catch (Exception exp) { exp.printStackTrace(); if(srcBmp != null && srcBmp.length == 1){ srcBmp[0] = null; }else if(srcBmp != null && srcBmp.length == 2){ srcBmp[1] = srcBmp[0] = null; }else{ srcBmp = new Bitmap[2]; } }catch (Error exp) { exp.printStackTrace(); srcBmp = new Bitmap[2]; } if (requestListItem != null) { requestListItem.setBitmap(srcBmp[0], srcBmp[1]); WiGalleryOpenGLRenderer.m_data_manager.AddNeedLoadTextureFile(requestListItem); if(CSStaticData.DEBUG){ if(srcBmp[0] != null && srcBmp[1] != null){ Log.w(TAG, "[ImageLoadService]追加文件贴图: " + requestListItemName.toString()); }else if(srcBmp[0] == null && srcBmp[1] == null){ Log.w(TAG, "[ImageLoadService]文件贴图: " + requestListItemName.toString() + "加载失败"); }else{ Log.w(TAG, "[ImageLoadService]文件贴图: " + requestListItemName.toString() + "部分加载成功"); } } } } srcBmp[0] = srcBmp[1] = null; } mRequestImageList.clear(); Thread.sleep(sleepMsec, sleepNsec); if(CSStaticData.DEBUG && Thread_DEBUG){ Log.w(TAG, "[ImageLoadService]线程已休眠: " + sleepMsec + "ms, " + sleepNsec + "ns" ); } } catch (InterruptedException exp) { exp.printStackTrace(); keepRuning = false; } catch (IOException e) { e.printStackTrace(); } } } if(CSStaticData.DEBUG){ Log.w(TAG, "[ImageLoadService]图片贴图加载私服停止"); } } }; return runnable; } /** * 视频缩略图加载线程的方法 * @return */ private Runnable videoLoadService(){ Runnable runnable = new Runnable() { long sleepMsec = 0; int sleepNsec = 0; List<Element> requestList = null; Options options = new Options(); boolean keepRuning = true; Bitmap srcBmp = null; @Override public void run() { if(CSStaticData.DEBUG){ Log.w(TAG, "[VideoLoadService]视频贴图加载私服启动"); } mRequestVideoList = new ArrayList<Element>(); while(keepRuning){ {//线程控制区间 if(Thread.interrupted()){ keepRuning = false; } } {//执行区间 try { if(CPU_DEBUG && CSStaticData.DEBUG){ Log.w("CPU_Trace", "Wicamera3D II CPU: " + Integer.valueOf(SystemInfo.getCpuWithApplicationName("com.wistron.swpc.wicamera3dii")) + "%"); } // 读取请求列表 if(WiGalleryOpenGLRenderer.m_data_manager == null){ Thread.sleep(sleepMsec, sleepNsec); if(CSStaticData.DEBUG && Thread_DEBUG){ Log.w(TAG, "[VideoLoadService]等待主数据列表创建,线程已休眠: " + sleepMsec + "ms, " + sleepNsec + "ns" ); } continue; } //splitRequestFileList(WiGalleryOpenGLRenderer.m_data_manager.getRequestLoadFileList()); if(requestList != null) requestList.clear(); requestList = new ArrayList<Element>(mRequestVideoList); mRequestVideoList.clear(); // 搜索文件 int requestListSize = requestList.size(); if(requestListSize == 0){ sleepMsec = 50; sleepNsec = 0; }else{ sleepMsec = 0; sleepNsec = 0; } for (int i = 0; i < requestListSize; i++) { Element requestListItem = requestList.get(i); if(requestListItem == null){ continue; } String requestListItemName = requestListItem.getName(); File file = new File(requestListItemName.toString()); {//视频私服强制停止 if(VIDEO_SERIVCE_STOP){ keepRuning = false; //直接停止线程 break; } if(VIDEO_SERIVCE_CANCEL){ VIDEO_SERIVCE_CANCEL = false; //只停止响应请求一次 break; } } if (FileTypeHelper.getFileType(requestListItemName.toString()) == FileTypeHelper.TYPE_VIDEO_2D) { if(!file.exists()){ if(CSStaticData.DEBUG){ Log.w(TAG, "[VideoLoadService]追加文件贴图: " + requestListItemName.toString() + "失败,文件不存在!"); } continue; } srcBmp = ThumbnailUtils.createVideoThumbnail(requestListItemName, Thumbnails.MINI_KIND); if(srcBmp != null){ try{ srcBmp = FileOperation.cutBitmapWithProportion( srcBmp, CSStaticData.THUMB_SIZE, CSStaticData.THUMB_SIZE, true); }catch(Exception exp){ exp.printStackTrace(); srcBmp = null; }catch (Error exp) { exp.printStackTrace(); srcBmp = null; } }else{ srcBmp = null; } if (requestListItem != null) { requestListItem.setBitmap(srcBmp, null); WiGalleryOpenGLRenderer.m_data_manager.AddNeedLoadTextureFile(requestListItem); if(CSStaticData.DEBUG){ if(srcBmp != null){ Log.w(TAG, "[VideoLoadService]追加文件贴图: " + requestListItemName.toString()); }else{ Log.w(TAG, "[VideoLoadService]文件贴图: " + requestListItemName.toString() + "加载失败"); } } } } if (FileTypeHelper.getFileType(requestListItemName.toString()) == FileTypeHelper.TYPE_VIDEO_3DJ) { if(CSStaticData.DEBUG){ Log.w(TAG, "[VideoLoadService]无法处理文件贴图: " + requestListItemName.toString()); } } if (FileTypeHelper.getFileType(requestListItemName.toString()) == FileTypeHelper.TYPE_VIDEO_3DS) { if(CSStaticData.DEBUG){ Log.w(TAG, "[VideoLoadService]无法处理文件贴图: " + requestListItemName.toString()); } } } mRequestVideoList.clear(); Thread.sleep(sleepMsec, sleepNsec); if(CSStaticData.DEBUG && Thread_DEBUG){ Log.w(TAG, "[VideoLoadService]线程已休眠: " + sleepMsec + "ms, " + sleepNsec + "ns" ); } } catch (InterruptedException exp) { exp.printStackTrace(); keepRuning = false; } catch (IOException e) { e.printStackTrace(); } } } if(CSStaticData.DEBUG){ Log.w(TAG, "[VideoLoadService]视频贴图加载私服停止"); } } }; return runnable; } /** * 按地址排序的方法 * @param list 传出参数,排序结果链表 * @param type 排序类型 * @return */ private Runnable parserGeoService(List<ElementList> list, final CSStaticData.LIST_TYPE type){ mSortedList = list; //传引用 Runnable runnable = new Runnable() { @Override public void run() { // 清理内存 if(mSortedList != null){ mSortedList.clear(); }else{ mSortedList = new ArrayList<ElementList>(); } {//执行区间 try { int mainListSize = 0, inputListSize = 0; boolean hasInserted = false; //是否以找到对应的列表,没有找到则新建一个列表 String tempAddr = ""; List<Element> mainDataList = null; if(WiGalleryOpenGLRenderer.m_data_manager == null){ return; }else{ mainDataList = WiGalleryOpenGLRenderer.m_data_manager.cloneMainList(); mainListSize = mainDataList.size(); } for(int i = 0; i < mainListSize; i++){//遍历主链表 if(Thread.interrupted()){ return; //可以直接return } tempAddr = GeoParser.parserGeo(mContext, mainDataList.get(i).m_latitude, mainDataList.get(i).m_latitude, type); inputListSize = mSortedList.size(); hasInserted = false; for(int j = 0; j < mSortedList.size(); j++){ if(Thread.interrupted()){ return; //可以直接return } //比较list中的每条列表的头结点 if(mSortedList.get(j).get(i).getName().equals(tempAddr)){ mSortedList.get(j).add(mainDataList.get(i)); hasInserted = true; break; } } //没有找到对应的链表,新建一个列表 if(!hasInserted){ if(Thread.interrupted()){ return; //可以直接return } ArrayList<Element> appendElementList = new ArrayList<Element>(); appendElementList.add(mainDataList.get(i)); mSortedList.add(new ElementList(appendElementList, type)); } } } catch (Exception e) { // TODO: handle exception } } } }; return runnable; } /** * 文件移动的方法 * @param fileList 待移动的文件 * @param desDir 目标目录 * @param ignoreOpenGL 不通知OpenGL层 * @return */ private Runnable moveFilesRunnable(final List<String> moveFileList, final String desDir, final boolean ignoreOpenGL, final int owner) { Runnable runable = new Runnable() { @Override public void run() { int dbResult = 0; int listSize = 0; int sucessNum = 0; //操作成功数量 int failedNum = 0; //操作失败数量 File fout = null; String resFilePath = null; String desFilePath = null; String filepath = null; ContentResolver resolver = null; List<String> fileList = new ArrayList<String>(moveFileList); List<String> destList = new ArrayList<String>(moveFileList); if(fileList != null){ listSize = fileList.size(); for(int i = 0; i < listSize; i++){ //发送操作过程消息 if(owner == WiGalleryActivity.WiGalleryActivityID){ if(WiGalleryActivity.mUIHandler != null && owner == WiGalleryActivity.WiGalleryActivityID){ Message msg = new Message(); msg.what = WiGalleryActivity.HANDLE_MOVE_PROGRESS; msg.arg1 = (i * 100)/(2 * listSize); WiGalleryActivity.mUIHandler.sendMessage(msg); } } fout = new File(fileList.get(i)); if(fout.exists()){ File desFile = new File(desDir + fout.getName()); resFilePath = fout.getAbsolutePath(); desFilePath = desFile.getAbsolutePath(); destList.set(i, desFilePath); if(CSStaticData.DEBUG){ Log.w(TAG, "[moveFiles]文件 " + resFilePath + " 至 " + desFilePath); } if(resFilePath.equals(desFilePath)){ continue; } if(!desFile.getParentFile().exists()){ //如果目录不存在,则创建目录 desFile.getParentFile().mkdirs(); } if(!FileOperation.moveFileTo(resFilePath, desFilePath)){ //如果移动不成功,就在文件名后加"_copy.",然后重试 String retryFileName = desDir + fout.getName(); String retryFileExten = retryFileName.substring(retryFileName.lastIndexOf("."), retryFileName.length()); retryFileName = retryFileName.substring(0, retryFileName.lastIndexOf(".")); retryFileName = retryFileName + CSStaticData.RENAME_SUFFIX + retryFileExten; if(CSStaticData.DEBUG){ Log.w(TAG, "[moveFiles]文件 " + fout.getAbsolutePath() + " 移动失败,重命名为 " + retryFileName + " 后重试!"); } desFile = new File(retryFileName); if(!desFile.getParentFile().exists()){ //如果目录不存在,则创建目录 desFile.getParentFile().mkdirs(); } if(!FileOperation.moveFileTo(resFilePath, retryFileName)){ //再不成功就不管了 if(CSStaticData.DEBUG){ Log.w(TAG, "[moveFiles]文件重命名为 " + retryFileName + " 后移动失败,可能没有写权限!"); } //移动失败,不再进行后续操作 failedNum ++; continue; }else{ if(CSStaticData.DEBUG){ Log.w(TAG, "[moveFiles]文件重命名为 " + retryFileName + " 后移动成功!"); } sucessNum ++; } }else{ if(CSStaticData.DEBUG){ Log.w(TAG, "[moveFiles]文件 " + fout.getAbsolutePath() + " 移动成功!"); } sucessNum ++; } }else{ sucessNum ++; } } //通知OpenGL if(!ignoreOpenGL){ if(WiGalleryOpenGLRenderer.m_data_manager != null && WiGalleryOpenGLRenderer.m_element_group != null){ for(int i = 0; i < listSize; i++){ resFilePath = fileList.get(i); desFilePath = destList.get(i); if(WiGalleryOpenGLRenderer.m_data_manager.Get(resFilePath) != null){ WiGalleryOpenGLRenderer.m_data_manager.Get(resFilePath).setName(desFilePath); } } WiGalleryOpenGLRenderer.m_element_group.rebuildList(); } } //操作数据库 if(mContext != null){ for(int i = 0; i < listSize; i++){ if(owner == WiGalleryActivity.WiGalleryActivityID){ //发送操作过程消息 if(WiGalleryActivity.mUIHandler != null && owner == WiGalleryActivity.WiGalleryActivityID){ Message msg = new Message(); msg.what = WiGalleryActivity.HANDLE_MOVE_PROGRESS; msg.arg1 = ((i + listSize) * 100)/(2 * listSize); WiGalleryActivity.mUIHandler.sendMessage(msg); } } resolver = mContext.getContentResolver(); resFilePath = fileList.get(i); desFilePath = destList.get(i); if(resFilePath.equals(desFilePath)){ continue; } //删除旧地址 if(FileTypeHelper.isImageFile(resFilePath)){ // if(FileTypeHelper.isInternalFile(filepath)){ try{ dbResult = resolver.delete(MediaStore.Images.Media.INTERNAL_CONTENT_URI, " " + MediaStore.Images.Media.DATA + " = '" + resFilePath + "' ", null); }catch (SQLiteException exp) { exp.printStackTrace(); //继续删除 mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + resFilePath))); dbResult = -1; } if(CSStaticData.DEBUG){ if(dbResult > 0){ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 成功"); }else if(dbResult == -1){ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 失败, 广播通知数据库自行删除"); }else{ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 失败"); } } // }else{ try{ dbResult = resolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, " " + MediaStore.Images.Media.DATA + " = '" + resFilePath + "' ", null); }catch (SQLiteException exp) { exp.printStackTrace(); //继续删除 mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_REMOVED, Uri.parse("file://" + resFilePath))); dbResult = -1; } if(CSStaticData.DEBUG){ if(dbResult > 0){ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 成功"); }else if(dbResult == -1){ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 失败, 广播通知数据库自行删除"); }else{ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 失败"); } } // } } if(FileTypeHelper.isVideoFile(resFilePath)){ // if(FileTypeHelper.isInternalFile(filepath)){ try{ dbResult = resolver.delete(MediaStore.Video.Media.INTERNAL_CONTENT_URI, " " + MediaStore.Images.Media.DATA + " = '" + resFilePath + "' ", null); }catch (SQLiteException exp) { exp.printStackTrace(); //继续删除 mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + resFilePath))); dbResult = -1; } if(CSStaticData.DEBUG){ if(dbResult > 0){ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 成功"); }else if(dbResult == -1){ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 失败, 广播通知数据库自行删除"); }else{ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 失败"); } } // }else{ try{ dbResult = resolver.delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, " " + MediaStore.Images.Media.DATA + " = '" + resFilePath + "' ", null); }catch (SQLiteException exp) { exp.printStackTrace(); //发送广播,继续删除 mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_REMOVED, Uri.parse("file://" + resFilePath))); dbResult = -1; } if(CSStaticData.DEBUG){ if(dbResult > 0){ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 成功"); }else if(dbResult == -1){ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 失败, 广播通知数据库自行删除"); }else{ Log.w(TAG, "[deleteFiles]移出数据库旧记录 " + resFilePath + " 失败"); } } // } } //插入新地址 mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + desFilePath))); } } //发送操作过程消息 if(owner == WiGalleryActivity.WiGalleryActivityID){ if(WiGalleryActivity.mUIHandler != null && owner == WiGalleryActivity.WiGalleryActivityID){ Message msg = new Message(); msg.what = WiGalleryActivity.HANDLE_MOVE_PROGRESS; if(listSize == 0){ msg.arg1 = 100; }else{ msg.arg1 = (listSize * 100)/(listSize); } WiGalleryActivity.mUIHandler.sendMessage(msg); } } } if(owner == WiGalleryActivity.WiGalleryActivityID){ //发送操作完成消息 Message msg = new Message(); msg.what = WiGalleryActivity.HANDLE_MOVE_COMPLETED; msg.arg1 = sucessNum; msg.arg2 = failedNum; msg.obj = resFilePath; if(WiGalleryActivity.mUIHandler != null && owner == WiGalleryActivity.WiGalleryActivityID){ WiGalleryActivity.mUIHandler.sendMessageDelayed(msg, 500); } } if(owner == WiImageViewerActivity.WiImageViewerActivityID){ Message msgViewer = new Message(); msgViewer.what = WiImageViewerActivity.CONTROL_HANDLER_SHOW_MOVEINFO; msgViewer.arg1 = sucessNum; msgViewer.arg2 = failedNum; msgViewer.obj = resFilePath; try { if(WiImageViewerActivity.m_handle_control_outside != null && owner == WiImageViewerActivity.WiImageViewerActivityID){ WiImageViewerActivity.m_handle_control_outside.sendMessage(msgViewer); } } catch (Error exp) { // TODO: handle exception } catch (Exception exp) { // TODO: handle exception } } } }; return runable; } private Runnable deleteFilesRunnable(final List<String> fileList, final boolean afterExit, final boolean ignoreOpenGL, final int owner){ Runnable runable = new Runnable() { @Override public void run() { int dbResult = 0; String filepath = null; int fileListSize = 0; int sucessNum = 0; int failedNum = 0; ContentResolver resolver = null; if(fileList != null && fileList.size() > 0){ fileListSize = fileList.size(); //1.删除主链表中对应条目 if(WiGalleryOpenGLRenderer.m_data_manager != null){ for(int i = 0; i < fileListSize; i++){ WiGalleryOpenGLRenderer.m_data_manager.Delete(fileList.get(i)); } }else{ return; } //2.通知OpenGL if(!ignoreOpenGL){ if(WiGalleryOpenGLRenderer.m_element_group != null){ WiGalleryOpenGLRenderer.m_element_group.m_is_drawing = false; WiGalleryOpenGLRenderer.m_element_group.rebuildList(); WiGalleryOpenGLRenderer.m_element_group.m_is_drawing = true; } } //3.删除文件系统 for(int i = 0; i < fileListSize; i++){ if(CSStaticData.DEBUG){ Log.w(TAG, "[deleteFiles]删除 " + fileList.get(i)); } //发送操作过程消息 if(WiGalleryActivity.mUIHandler != null && owner == WiGalleryActivity.WiGalleryActivityID){ Message msg = new Message(); msg.what = WiGalleryActivity.HANDLE_DELETE_PROGRESS; if(fileListSize == 0){ msg.arg1 = 0; }else{ msg.arg1 = (i * 100)/(2 * fileListSize); } WiGalleryActivity.mUIHandler.sendMessage(msg); } if(afterExit){//退出后删除 new File(fileList.get(i)).deleteOnExit(); sucessNum ++; }else{//即时删除 if(new File(fileList.get(i)).delete()){ sucessNum ++; }else{ failedNum ++; } } } //4.删除数据库中对应条目 if(mContext != null){ for(int i = 0; i < fileListSize; i++){ //发送操作过程消息 if(WiGalleryActivity.mUIHandler != null && owner == WiGalleryActivity.WiGalleryActivityID){ Message msg = new Message(); msg.what = WiGalleryActivity.HANDLE_DELETE_PROGRESS; if(fileListSize == 0){ msg.arg1 = 0; }else{ msg.arg1 = ((i + fileListSize) * 100)/(2 * fileListSize); } WiGalleryActivity.mUIHandler.sendMessage(msg); } resolver = mContext.getContentResolver(); filepath = fileList.get(i); if(FileTypeHelper.isImageFile(filepath)){ // if(FileTypeHelper.isInternalFile(filepath)){ try{ dbResult = resolver.delete(MediaStore.Images.Media.INTERNAL_CONTENT_URI, " " + MediaStore.Images.Media.DATA + " = '" + filepath + "' ", null); }catch (SQLiteException exp) { exp.printStackTrace(); //继续删除 mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + filepath))); dbResult = -1; } if(CSStaticData.DEBUG){ if(dbResult > 0){ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 成功"); }else if(dbResult == -1){ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 失败, 广播通知数据库自行删除"); }else{ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 失败"); } } // }else{ try{ dbResult = resolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, " " + MediaStore.Images.Media.DATA + " = '" + filepath + "' ", null); }catch (SQLiteException exp) { exp.printStackTrace(); //继续删除 mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_REMOVED, Uri.parse("file://" + filepath))); dbResult = -1; } if(CSStaticData.DEBUG){ if(dbResult > 0){ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 成功"); }else if(dbResult == -1){ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 失败, 广播通知数据库自行删除"); }else{ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 失败"); } } // } } if(FileTypeHelper.isVideoFile(filepath)){ // if(FileTypeHelper.isInternalFile(filepath)){ try{ dbResult = resolver.delete(MediaStore.Video.Media.INTERNAL_CONTENT_URI, " " + MediaStore.Images.Media.DATA + " = '" + filepath + "' ", null); }catch (SQLiteException exp) { exp.printStackTrace(); //继续删除 mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + filepath))); dbResult = -1; } if(CSStaticData.DEBUG){ if(dbResult > 0){ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 成功"); }else if(dbResult == -1){ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 失败, 广播通知数据库自行删除"); }else{ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 失败"); } } // }else{ try{ dbResult = resolver.delete(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, " " + MediaStore.Images.Media.DATA + " = '" + filepath + "' ", null); }catch (SQLiteException exp) { exp.printStackTrace(); //发送广播,继续删除 mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_REMOVED, Uri.parse("file://" + filepath))); dbResult = -1; } if(CSStaticData.DEBUG){ if(dbResult > 0){ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 成功"); }else if(dbResult == -1){ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 失败, 广播通知数据库自行删除"); }else{ Log.w(TAG, "[deleteFiles]移出数据库记录 " + filepath + " 失败"); } } // } } } } //发送操作过程消息 if(WiGalleryActivity.mUIHandler != null && owner == WiGalleryActivity.WiGalleryActivityID){ Message msg = new Message(); msg.what = WiGalleryActivity.HANDLE_DELETE_PROGRESS; if(fileListSize == 0){ msg.arg1 = 100; }else{ msg.arg1 = (fileListSize * 100)/(fileListSize); } WiGalleryActivity.mUIHandler.sendMessage(msg); } } //发送操作完成消息 if(WiGalleryActivity.mUIHandler != null && owner == WiGalleryActivity.WiGalleryActivityID){ Message msg = new Message(); msg.what = WiGalleryActivity.HANDLE_DELETE_COMPLETED; msg.arg1 = sucessNum; msg.arg2 = failedNum; msg.obj = filepath; WiGalleryActivity.mUIHandler.sendMessageDelayed(msg, 100); } } }; return runable; } /** * 网络连通性检查方法 * @return */ private Runnable checkInternetRunnable() { Runnable runnable = new Runnable() { @Override public void run() { NetworkInfo networkInfo = null; ConnectivityManager connectivityManager = null; boolean isNetWorkConnectable = true; //判断网络状态 connectivityManager = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); networkInfo = connectivityManager.getActiveNetworkInfo(); if (networkInfo == null || !networkInfo.isConnected()) { isNetWorkConnectable = false; } //发送测试结果 Message msg = new Message(); msg.what = WiGalleryActivity.HANDLE_WIFI_CHECKED; msg.obj = isNetWorkConnectable; WiGalleryActivity.mUIHandler.sendMessage(msg); } }; return runnable; } /** * 恢复选择模式的方法 * @return */ @SuppressWarnings("unused") private Runnable recoverSelectionModeRunnable(final List<Element> stateList) { Runnable runnable = new Runnable() { @Override public void run() { int size = 0; if(stateList != null && stateList.size() != 0){ } } }; return runnable; } private Runnable setFavoriteToDBRunnable(final List<String> selectedList, final int owner) { return new Runnable() { @Override public void run() { FavoriteDBAdapter dbAdapter = new FavoriteDBAdapter(mContext); dbAdapter.setAsFavorite(selectedList); dbAdapter.dispose(); dbAdapter = null; System.gc(); //修改主链表 if(WiGalleryOpenGLRenderer.m_data_manager != null){ int favorSize = selectedList.size(); for(int i = 0; i < favorSize; i++){ Element elem = WiGalleryOpenGLRenderer.m_data_manager.Get(selectedList.get(i)); if(elem != null) elem.setFavorite(true); } } //发送消息 if(WiGalleryActivity.mUIHandler != null && owner == WiGalleryActivity.WiGalleryActivityID){ WiGalleryActivity.mUIHandler.sendEmptyMessage(WiGalleryActivity.HANDLE_SET_FAVORITE_TIP); } } }; } private Runnable removeFavoriteFromDBRunnable(final List<String> selectedList, final int owner) { return new Runnable() { @Override public void run() { FavoriteDBAdapter dbAdapter = new FavoriteDBAdapter(mContext); dbAdapter.removeFromFavorite(selectedList); dbAdapter.dispose(); dbAdapter = null; System.gc(); //修改主链表 if(WiGalleryOpenGLRenderer.m_data_manager != null){ int favorSize = selectedList.size(); for(int i = 0; i < favorSize; i++){ Element elem = WiGalleryOpenGLRenderer.m_data_manager.Get(selectedList.get(i)); if(elem != null) elem.setFavorite(false); } } //发送消息 if(WiGalleryActivity.mUIHandler != null && owner == WiGalleryActivity.WiGalleryActivityID){ WiGalleryActivity.mUIHandler.sendEmptyMessage(WiGalleryActivity.HANDLE_REMOVE_FAVORITE_TIP); } } }; } private Runnable scanFavoriteDBRunnable(){ return new Runnable() { @Override public void run() { setFavoriteSettingToMainList(); } }; } @SuppressWarnings("unused") //for DEBUG block private void splitRequestFileList(List<Element> requestList){ int size = 0; long requestOpID = System.currentTimeMillis(); if(requestList != null){ size = requestList.size(); if(CSStaticData.DEBUG && false){ Log.w(TAG, "[splitRequestFileList]本次请求文件 " + size + " 个,ID = " + requestOpID); } for(int i = 0; i < size; i++){ //必须分别对每个类型单独判断,以免遇到不支持的文件时,误判 if(FileTypeHelper.isVideoFile(requestList.get(i).getName())){ synchronized(mRequestVideoList){ mRequestVideoList.add(requestList.get(i)); } } if(FileTypeHelper.isImageFile(requestList.get(i).getName())){ synchronized(mRequestImageList){ mRequestImageList.add(requestList.get(i)); } } } if(CSStaticData.DEBUG && false){ int imageSize = 0, videoSize = 0; try{ synchronized(mRequestVideoList){ imageSize = mRequestVideoList.size(); } synchronized(mRequestImageList){ videoSize = mRequestImageList.size(); } }catch (NullPointerException e) { // TODO: handle exception } Log.w(TAG, "[splitRequestFileList]---图片 " + imageSize + " 个, ID = " + requestOpID); Log.w(TAG, "[splitRequestFileList]---视频" + videoSize + " 个, ID = " + requestOpID); } requestList.clear(); } } public static void SortListByLocation(List<ElementList> list, CSStaticData.LIST_TYPE type){ int mainListSize = 0, inputListSize = 0; boolean hasCanceled = false; boolean hasInserted = false; //是否以找到对应的列表,没有找到则新建一个列表 String tempAddr = ""; List<Element> mainDataList = null; Element tempElement = null; if(WiGalleryOpenGLRenderer.m_data_manager == null){ return; }else{ mainDataList = WiGalleryOpenGLRenderer.m_data_manager.cloneMainList(); if(mainDataList == null){ return; } mainListSize = mainDataList.size(); } if(list != null){ list.clear(); } for(int i = 0; i < mainListSize; i++){//遍历主链表 if(hasCanceled){ return; //可以直接return } tempElement = mainDataList.get(i); if(tempElement.m_str_address != null){ int size = 0; // size = tempElement.m_str_address.length; if(type == CSStaticData.LIST_TYPE.LIST_LOCATION_1){ size = 1; } if(type == CSStaticData.LIST_TYPE.LIST_LOCATION_2){ size = 2; } if(type == CSStaticData.LIST_TYPE.LIST_LOCATION_3){ size = 3; } if(type == CSStaticData.LIST_TYPE.LIST_LOCATION_4){ size = 4; } if(tempElement.m_str_address.length < size){ size = tempElement.m_str_address.length; } for(int m = 0; m < size; m++){ tempAddr = tempElement.m_str_address[m] + ", "; } if(tempAddr.length() >= 2){ tempAddr = tempAddr.substring(0, tempAddr.length() - 2); } }else{ tempAddr = "Unknown"; } inputListSize = list.size(); hasInserted = false; for(int j = 0; j < list.size(); j++){ if(hasCanceled){ return; //可以直接return } //比较list中的每条列表的头结点 if(list.get(j).getName().equals(tempAddr)){ list.get(j).add(mainDataList.get(i)); hasInserted = true; break; } } //没有找到对应的链表,新建一个列表 if(!hasInserted){ if(hasCanceled){ return; //可以直接return } ArrayList<Element> appendElementList = new ArrayList<Element>(); ElementList tmpElementList = null; appendElementList.add(mainDataList.get(i)); tmpElementList = new ElementList(appendElementList, type); tmpElementList.setName(tempAddr); list.add(tmpElementList); } } } /** * 在主链表中恢复喜好数据库中文件的喜好 */ public void setFavoriteSettingToMainList(){ int favorSize = 0; List<String> favorList = new ArrayList<String>(); FavoriteDBAdapter dbAdapter = new FavoriteDBAdapter(mContext); if(WiGalleryOpenGLRenderer.m_data_manager == null || WiGalleryOpenGLRenderer.m_data_manager.getMainListSize() == 0){ return; } favorList = dbAdapter.getFavoriteFiles(); if(favorList != null && favorList.size() > 0){ favorSize = favorList.size(); for(int i = 0; i < favorSize; i++){ Element elem = WiGalleryOpenGLRenderer.m_data_manager.Get(favorList.get(i)); if(elem != null) elem.setFavorite(true); } } dbAdapter.dispose(); } public void setOnDataScanCompletedListener(OnDataScanCompletedListener listener){ this.mOnDataScanCompletedListener = listener; } /** * 重建数据层 */ // public void flushDataLayer(){ // if(WiGalleryOpenGLRenderer.m_data_manager != null){ // //清空DataManager // WiGalleryOpenGLRenderer.m_data_manager.clearMainList(); // //扫描文件数据库 // scanMediaLib(); // //重建显示链表 // setOnDataScanCompletedListener(new OnDataScanCompletedListener() { // @Override // public void onDataScanCompletedListener() { // if(CSStaticData.DEBUG){ // Log.w(TAG, "[flushDataLayer]重建显示链表"); // } // WiGalleryOpenGLRenderer.m_element_group.rebuildList(); // } // }); // } // } /** * 清空数据库 * @param execArea 执行范围 */ public void clearDatabase(int execArea){ switch (execArea) { case CLEAR_DATABASE_ALL: { GEOCacheHelper dbAdapter = new GEOCacheHelper(mContext); dbAdapter.clearDataBase(); dbAdapter.close(); } { FavoriteDBAdapter dbAdapter = new FavoriteDBAdapter(mContext); dbAdapter.clearDataBase(); dbAdapter.dispose(); } break; case CLEAR_DATABASE_GEO:{ GEOCacheHelper dbAdapter = new GEOCacheHelper(mContext); dbAdapter.clearDataBase(); dbAdapter.close(); } break; case CLEAR_DATABASE_FAVORITE:{ FavoriteDBAdapter dbAdapter = new FavoriteDBAdapter(mContext); dbAdapter.clearDataBase(); dbAdapter.dispose(); } break; default: break; } } public interface OnDataScanCompletedListener{ public void onDataScanCompletedListener(); } }