Android 获取照片位置信息

首先,需要读取手机本地的照片信息,可以借助ContentProvider读取本地媒体数据库来获得。
打开DDMS,在data/data/com.android.prividers.media/databases/external.db 将external.db导出到桌面查看,所有的媒体文件都存储在 files表中,打开如图:
Android 获取照片位置信息_第1张图片

由于我使用的是全新的模拟器,所以里边并没有媒体文件的信息。
可以看到有很多字段。
_data 媒体文件的存储路径
_size 媒体文件大小
date_added 媒体文件添加日期
date_modified 媒体文件修改日期
_display_name 媒体文件名称
latitude 媒体文件的经度信息
longitude 媒体文件的纬度信息
title 媒体文件标题
media_type 媒体文件类型 1代表图片 2代表录音 3代表视频
duration 视频文件时长
width 媒体文件宽
height 媒体文件高

下面我们就演示一下,用模拟器拍张照片。
然后重新导出external.db 查看 files 表 :
这里写图片描述
Android 获取照片位置信息_第2张图片

可以看到该照片的信息存储在了数据库中,但仔细查看 latitude 和 longitude 的值为null ,怎么回事呢?
仔细想想,我们没有开启gps定位权限,怎么能获取到位置信息并存储呢。然后我们打开gps定位权限,并开启相机中保存位置按钮。我使用的是模拟器,如图:
Android 获取照片位置信息_第3张图片

然后重新拍照,导出external.db 查看 files 表,如下,可以看到latitude 和 longitude 中都有值了。Android 获取照片位置信息_第4张图片


下面就读取该数据库文件的工作了,使用到了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"/>
运行程序,点击按钮发现刚才所有的照片都读取到了

Android 获取照片位置信息_第5张图片

获取视频文件方法类似:

 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);

你可能感兴趣的:(Android)