Android 的多媒体数据库文件存在什么地方呢 ?/data/data/com.android.providers.media/databases 只要有权限的手机都可以看到有两个数据库文件,
internal.db和external-**.db,分别对应内部存储器数据库文件和外部存储器数据库文件。
都第三节了,各位可能都着急还没有Activity的分析,其实外围分析清楚了,内部才更清楚。
root 手机后(ENG版本不用),adb 将数据库文件拉出来,使用命令或者数据库工具打开文件,看下有哪些表
albums
album_art
artiest
image
video
thumbnails
videothumbnails
这里详细记录了音频 视频 图片的相关信息,甚至连图片缩略图和视频缩略图也有表格
这里说明一个问题,扫描不光扫描路径和建立数据库,还把缩略图也建立好了。
但是有个问题,图片本身很大也很多,即使是缩略图也不会小,会把整个缩略图都放到数据库中么?
答案当然不是,扫描的时候将缩略图保存在T卡/DCIM/.thumbnails/目录中,数据库中只保存一个指向的路径就可以了。
到缩略图界面时,我们只要将这些图贴上去就好了,这个界面简单吧。
有个问题,如果没有T卡,那不是找不到这个目录么?
是的,没有T卡,你会发现Gallery3D 跑起来后提示 [无可用外部存储器],然后就退出来了。这也说明没有T卡,Gallery的缩略图看不到的原因。
系统竟然做好了这么多工作,而且现在Gallery3D还没有跑起来。
那么我们准备学习主要的Activity,在学习主Activity之前,最好先学习一下OpenGL 的内容,因为这个Activity里面要用到,开始学习相关内容。
public final class Gallery extends Activity{ private RenderView mRenderView = null; private GridLayer mGridLayer; @Override public void onCreate(Bundle savedInstanceState){ mRenderView = new RenderView(this); mGridLayer = new GridLayer(this, (int) (96.0f * App.PIXEL_DENSITY), (int) (72.0f * App.PIXEL_DENSITY), new GridLayoutInterface(4), mRenderView); mRenderView.setRootLayer(mGridLayer); setContentView(mRenderView); } }
public final class RenderView extends GLSurfaceView implements GLSurfaceView.Renderer, SensorEventListener { }
public final class GridLayer extends RootLayer implements MediaFeed.Listener, TimeBar.Listener { }
public abstract class RootLayer extends Layer { }
简化代码,发现Gallery就是一个Activity,里面加了个东西,一个继承于GLSurfaceView的视图mRenderView,而且这个View 将mGridLayer设置成了根层
这些都用什么作用呢?
我们现在理解的是,添加了一个视图,那么在setContentView 之后,在RenderView之中看到了两个消息响应
@Override public boolean onTouchEvent(MotionEvent event) { // Ignore events received before the surface is created to avoid // deadlocking with GLSurfaceView's needToWait(). if (mGL == null) { return false; } // Wait for the render thread to process this event. if (mTouchEventQueue.size() > 8 && event.getAction() == MotionEvent.ACTION_MOVE) return true; synchronized (mTouchEventQueue) { MotionEvent eventCopy = MotionEvent.obtain(event); mTouchEventQueue.addLast(eventCopy); requestRender(); } return true; }
如果GL刷新还没有好,就没有任何作用,触摸消息队列大于8后的触摸移动消息就没有用了,所以移动很长时间对于这个应用是没有作用的。
将获得的消息放到队列中,刷新界面。谁来处理呢?下次我们会讲
而按键消息呢?
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // Ignore events received before the surface is created to avoid // deadlocking with GLSurfaceView's needToWait(). if (mGL == null) { return false; } // Wait for the render thread to process this event. try { synchronized (this) { mCurrentKeyEvent = event; mCurrentEventType = EVENT_KEY; requestRender(); long timeout = SystemClock.uptimeMillis() + 50; do { wait(50); } while (mCurrentEventType != EVENT_NONE && SystemClock.uptimeMillis() < timeout); } } catch (InterruptedException e) { // Stop waiting for the render thread if interrupted. } // Key events are handled on the main thread. boolean retVal = false; if (!mCurrentKeyEventResult) { retVal = super.onKeyDown(keyCode, event); } else { retVal = true; } requestRender(); return retVal; }
只看到存储按键事件,和刷新,什么地方处理的?下次我们讲解