相机照片上传

       这两天做了个利用高德地图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.csdn.net/nugongahou110/article/details/48154859不错


还需要注意的是bitmap压缩方法

        


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值