首先,需要读取手机本地的照片信息,可以借助ContentProvider读取本地媒体数据库来获得。
打开DDMS,在data/data/com.android.prividers.media/databases/external.db 将external.db导出到桌面查看,所有的媒体文件都存储在 files表中,打开如图:
由于我使用的是全新的模拟器,所以里边并没有媒体文件的信息。
可以看到有很多字段。
_data 媒体文件的存储路径
_size 媒体文件大小
date_added 媒体文件添加日期
date_modified 媒体文件修改日期
_display_name 媒体文件名称
latitude 媒体文件的经度信息
longitude 媒体文件的纬度信息
title 媒体文件标题
media_type 媒体文件类型 1代表图片 2代表录音 3代表视频
duration 视频文件时长
width 媒体文件宽
height 媒体文件高
下面我们就演示一下,用模拟器拍张照片。
然后重新导出external.db 查看 files 表 :
可以看到该照片的信息存储在了数据库中,但仔细查看 latitude 和 longitude 的值为null ,怎么回事呢?
仔细想想,我们没有开启gps定位权限,怎么能获取到位置信息并存储呢。然后我们打开gps定位权限,并开启相机中保存位置按钮。我使用的是模拟器,如图:
然后重新拍照,导出external.db 查看 files 表,如下,可以看到latitude 和 longitude 中都有值了。
下面就读取该数据库文件的工作了,使用到了ContentProvider
创建PhotoTest项目,代码如下:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_get).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getPhotoLocation();
}
});
}
private static final String[] SELECTIMAGES = {
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.TITLE,
MediaStore.Images.Media.DATE_ADDED,
MediaStore.Images.Media.DATE_MODIFIED,
MediaStore.Images.Media.LATITUDE,
MediaStore.Images.Media.LONGITUDE,
MediaStore.Images.Media.SIZE
};
private void getPhotoLocation() {
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
SELECTIMAGES,
null,
null,
null);
int i = 0;
if (cursor != null) {
while (cursor.moveToNext()) {
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
File file = new File(path);
if (!file.exists() || !file.canRead()) continue;
String name = cursor.getString(cursor.getColumnIndex( MediaStore.Images.Media.DISPLAY_NAME));
String title = cursor.getString(cursor.getColumnIndex( MediaStore.Images.Media.TITLE));
long addDate = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.DATE_ADDED));
long modifyDate = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED));
float latitude = cursor.getFloat(cursor.getColumnIndex(MediaStore.Images.Media.LATITUDE));
float longitude = cursor.getFloat(cursor.getColumnIndex(MediaStore.Images.Media.LONGITUDE));
long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.SIZE));
i++;
Log.d(TAG+i, "onCreate: "
+"path:-------"+path +"\n"
+"name:-------"+name +" "
+"title:------"+title+" "
+"addDate:----"+addDate+"\n"
+"modifyDate:-"+modifyDate+"\n"
+"latitude:---"+latitude+" "
+"longitude:--"+longitude+" "
+"size:-------"+size
);
}
cursor.close();
}
}
}
记得加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
运行程序,点击按钮发现刚才所有的照片都读取到了
获取视频文件方法类似:
private static final String[] SELECTVIDEOS = {
MediaStore.Video.Media.DATA,
MediaStore.Video.Media.DISPLAY_NAME,
MediaStore.Video.Media.TITLE,
MediaStore.Video.Media.DATE_ADDED,
MediaStore.Video.Media.DATE_MODIFIED,
MediaStore.Video.Media.LATITUDE,
MediaStore.Video.Media.LONGITUDE,
MediaStore.Video.Media.SIZE,
MediaStore.Video.Media.DURATION
};
private void getVideoLocation() {
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
SELECTVIDEOS,
null,
null,
null);
int i = 0;
if (cursor != null) {
while (cursor.moveToNext()) {
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
File file = new File(path);
if (!file.exists() || !file.canRead()) continue;
String name = cursor.getString(cursor.getColumnIndex( MediaStore.Video.Media.DISPLAY_NAME));
String title = cursor.getString(cursor.getColumnIndex( MediaStore.Video.Media.TITLE));
long addDate = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DATE_ADDED));
long modifyDate = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DATE_MODIFIED));
float latitude = cursor.getFloat(cursor.getColumnIndex(MediaStore.Video.Media.LATITUDE));
float longitude = cursor.getFloat(cursor.getColumnIndex(MediaStore.Video.Media.LONGITUDE));
long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.SIZE));
//视频时长
long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DURATION));
i++;
Log.d(TAG+i, "onCreate: "
+"path:-------"+path +"\n"
+"name:-------"+name +" "
+"title:------"+title+" "
+"addDate:----"+addDate+"\n"
+"modifyDate:-"+modifyDate+"\n"
+"latitude:---"+latitude+" "
+"longitude:--"+longitude+" "
+"size:-------"+size+ " "
+"duration:-------"+duration
);
}
cursor.close();
}
}
文件添加日期 可以使用SimpleDateFormat转化。
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1513565779);
String addTime = simpleDateFormat.format(date);