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;
}
只看到存储按键事件,和刷新,什么地方处理的?下次我们讲解