不懂就学系列(二):调用相机拍照并上传图片(intent为null)

前言:本系列是我在平时工作中遇到的一些问题,通过各种途径解决之后的经验之谈

最近项目有一个需求,就是拍照上传图片。其实这个需求,分解之后挺简单的。不外乎就是:

1.调用相机拍照

2.保存图片到指定位置(这里不用默认位置,是因为,我后面上传需要给地址,自己写一个,可以方便用)

3.在onActivityResult中获取图片,显示图片

4.压缩图片,上传

1,2:相机拍照and保存图片到指定位置

//这一句不用解释吧,拍照

Intent takePictureIntent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE);

if(takePictureIntent.resolveActivity(activity.getPackageManager()) !=null) {

//创建图片文件(路径就放在这里面了)

File photoFile = createImageFile();

 if(photoFile !=null) {

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile));

//这里添加这个文件的绝对路径

activity.setPathForCamera(photoFile.getAbsolutePath());

}

}

activity.startActivityForResult(takePictureIntent,5);//跳转界面传回拍照所得数据


/**

* 保存相机拍摄的图片

*/

private File createImageFile() {

File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

File imageFile =null;

try{

imageFile = File.createTempFile(generateFileName(),".jpg",storageDir);

}catch(IOException e) {

e.printStackTrace();

}

return imageFile;

}

3.在onActivityResult中获取图片(显示,这里就不写了)

@Override

protected voidonActivityResult(intrequestCode, intresultCode,Intent data) {

if(requestCode ==Photo&& resultCode ==RESULT_OK) {

//这里这个data是为null的,这样是得不到这个之前那个文件的,原因后面解释通过getPathForCamera

//方法获取uri,进而得到这个文件的

//data.getParcelableExtra()

//这里,获取之前添加的路径

File photoFile =newFile(getPathForCamera());

//压缩和上传

proxy.compressAndUploadPic(photoFile,UploadFileBusiness.CHECK_PIC);

}

}

4.压缩图片,上传

/**

* 压缩并上传图片

*/

public void compressAndUploadPic(File file, final intfileType) {


//这下面的注释部分,其实是显示图片的逻辑,不过这里不需要,就注释了

//Uri uri = UriUtils.getImageContentUri(activity,file);

//DataModel select =newDataModel(uri, false);

//mDatas.remove(addModel);

//mDatas.add(select);

//if(mDatas.size() < Constant.MAX_PIC_CHECK) {

//mDatas.add(addModel);

//}

//mAdapter.setData(mDatas);

//这里用的是luban框架帮我做压缩

Luban.with(activity)

.load(file)

.setCompressListener(newOnCompressListener() {

@Override

public void onStart() {

}

@Override

public void onSuccess(File file) {

//提交到服务器

uploadSingleFile(file,urls,fileType);

}

@Override

public void onError(Throwable e) {

}

}).launch();

}


ok,多余的不多说了,就来说一说,之前说到的,//data.getParcelableExtra()  为null的问题。原因,很简单,就是因为我指定路径之后,但是相机的activity是原生的,它是可以收到我activity发给它的数据,但是,重点,它不会通过intent绑定数据,返回回来。因为,我们无法控制相机的intent,相机的机制,只会处理某些(比如默认路径)路径(我随意指定的路径,目前是不能处理的)。所以,这里的intent就为null了。那么解决方案就是,我所写的那样,用一个变量去保存那个路径,然后,通过这个路径拿出这张图片。好了,这样子就可以解决,inten为空,拿不到照片了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,872评论 0 17
  • (1)闹钟 创建闹钟(ACTION_SET_ALARM)示例Intent: 注:为了调用ACTION_SET_AL...
    sunnygarden阅读 5,665评论 0 10
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,251评论 25 709
  • 元辰宫(心灵花园)练习,为了探访往生亲人,去地狱逛了一圈,不,是两圈,偶尔发现,我曾在这里工作过,是那个写生死簿的...
    宝光_光宝阅读 4,394评论 1 3
  • 《且听风吟》,so小资的一个书名。什么意思呢?坐在海边听风吹过的声音?眼前就出现浪漫的情形:一对恋人,静静地相拥着...
    卿若安阅读 3,211评论 2 0

友情链接更多精彩内容