这两天做了个利用高德地图api实现可以吧当前位置结合图片以及其他信息上传到服务器的测试app,然后可以通过下载服务器端的位置信息,在地图上利用marker标出位置。
在做的过程中呢,主要碰到了两个老问题:
1、图片和URI真实路径,File操作函数不熟悉
2、利用okHttp上传图片,信息不熟悉
利用okHttp上传信息:
String TreeNo = "1803061446020001";
String Time = "1520318760141";
String leixing = "2";
String infection = "1";
String lat = String.valueOf(currentLat);
String lon = String.valueOf(currentlon);
File file = new File(Environment.getExternalStorageDirectory(),"GDTT.png");
RequestBody fileBody = RequestBody.create(MediaType.parse("image/png"),file );
MultipartBody mBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
/* 上传一个普通的String参数 , key 叫 "p" */
.addFormDataPart("treeNo", "1803091446020001")
.addFormDataPart("lat", lat).addFormDataPart("lon", lon)
.addFormDataPart("createTime", "1520318760341")
.addFormDataPart("typeId", leixing)
.addFormDataPart("infectionId", infection)
.addFormDataPart("userId", "2")
.addFormDataPart("remarkDesc", "GaoDe Test")
.addFormDataPart("photo", "photo", fileBody)
.build();//3ur
String uri = "**********************";//此处隐藏服务器端地址
Request request = new Request.Builder()
.url(uri).post(mBody)
.build();
OkHttpClient client = new OkHttpClient();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d(TAG, "Upload success");
}
});
利用照相机得到照片,并存储:
首先,跳转到系统相机界面:
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == RESULT_OK) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
}
}
通过这种方式,得到了拍照所得到的bitmap格式的照片。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == RESULT_OK) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
//iamgeView.setImageBitmap(photo);
try{
File file = new File(Environment.getExternalStorageDirectory(),"GDTT.png");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
photo.compress(Bitmap.CompressFormat.JPEG, 100, bos);
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面的代码块把bitmap图片压缩,并保存。
注意:
Environment.getExternalStorageDirectory()
这种方式得到外部存储器的path;直接放在主目录下;SD卡根路径
context.getExternalCacheDir().getPath()
而这种方式会存在在外部存储器的android/data/包名 文件夹下。
网上大神详解:
getCacheDir()方法用于获取/data/data/<application package>/cache目录
getFilesDir()方法用于获取/data/data/<application package>/files目录
通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据
通过Context.getExternalCacheDir()方法可以获取到 SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
如果使用上面的方法,当你的应用在被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。
优秀程序员写法:
public String getDiskCacheDir(Context context) {
String cachePath = null;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
|| !Environment.isExternalStorageRemovable()) {
cachePath = context.getExternalCacheDir().getPath();
} else {
cachePath = context.getCacheDir().getPath();
}
return cachePath;
}
当SD卡存在或者SD卡不可被移除的时候,就调用getExternalCacheDir()方法来获取缓存路径,否则就调用getCacheDir()方法来获取缓存路径。前者获取到的就是 /sdcard/Android/data/<application package>/cache 这个路径,而后者获取到的是 /data/data/<application package>/cache 这个路径。
这个blog:http://blog.youkuaiyun.com/nugongahou110/article/details/48154859不错
还需要注意的是bitmap压缩方法