Android头像--拍照上传

来源:互联网 发布:python编程 中文 pdf 编辑:程序博客网 时间:2024/05/18 00:52

今天早上想给上次的头像增加拍照上传功能,不单单是相册选择。于是遇见了好多麻烦。

首先,dialog改成两个选项;

 AlertDialog.Builder builder = new AlertDialog.Builder(Myfragment_tx.this);                        builder.setTitle("选择图片");                        final String[] items = {"拍照","从相册中选择"};                        builder.setItems(items, new DialogInterface.OnClickListener(){                            public void onClick(DialogInterface dialog, int which)                            {                                switch (which){                                    case  0:                                        openCamera();                                        break;                                    case  1:                                        Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);                                        intent.setType("image/*");                                        startActivityForResult(intent, 0);                                        break;                                }                            }                        });                        AlertDialog dialog = builder.create();                        dialog.setCanceledOnTouchOutside(true);                        dialog.show();
 public  void  openCamera(){        SimpleDateFormat formatter = new SimpleDateFormat ("yyyy_MM_dd_HH_mm_ss");        Date curDate = new Date(System.currentTimeMillis());//获取当前时间          String str = formatter.format(curDate);        Intent intent1 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);        File file = new File(Environment.getExternalStorageDirectory()+"/lrsa/img/",                "head"+str+".jpg");        outPutFile = Uri.fromFile(file);        intent1.putExtra(MediaStore.EXTRA_OUTPUT, outPutFile);        startActivityForResult(intent1, 1);    }
然后测试就炸了,开始修正工作,告诉是这个样子的---->
     java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=android/com.android.internal.app.ResolverActivity clip={text/uri-list U:file:///storage/emulated/0/lrsa/img/test.jpg} (has extras) } from ProcessRecord{7c18b6c 9475:com.dareway.apps.lrsa/u0a246} (pid=9475, uid=10246) with revoked permission android.permission.CAMERA

好吧,看在的英语水平还过关的份上,我认出貌似权限的问题,找相机权限

<uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

但是这两个都加了,再菜也不能忘记这两个对吧,改动了一下发现还是不可用。就想到一个问题,好吧,又是该死的版本权限问题,Android6.0和以前不一样,旧的可以直接那么写,但新的要求这么玩--->

if(  MainActivity.this.checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ) {            // 申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)            requestPermissions(new String[]{ Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CALL);   }
 public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults)    {        super.onRequestPermissionsResult(requestCode, permissions,grantResults);          .......    }
重要的事情说三遍:请记得动态授权,动态授权,动态授权。相机启动了,也拍照了,然后就结束了,对,平平淡淡的没有反应,这是什么鬼,这不是我的需求!这是之前的代码,我做个一个intent data检测,看看是不是为空,结果用相机拍照,果然会为空,data为null。 protected void onActivityResult(int requestCode, int resultCode, Intent data) {        Bitmap bitmap = null;        if(data==null){                 return;//当data为空的时候,不做任何处理         }          if(requestCode==0){             try {                //通过URI得到输入流                InputStream inputStream = getContentResolver().openInputStream(data.getData());                //通过输入流得到bitmap对象                 BitmapFactory.Options opts = new BitmapFactory.Options();                 opts.inSampleSize = 4;                bitmap = BitmapFactory.decodeStream(inputStream,null,opts);                 filePath=getPath.getPath(this,data.getData());              } catch (IOException e) {                e.printStackTrace();            }        }        imageView.setImageBitmap(bitmap);     }

看了看问题在这里-->
 File file = new File(Environment.getExternalStorageDirectory()+"/lrsa/img/",                "head"+str+".jpg");  outPutFile = Uri.fromFile(file);  intent1.putExtra(MediaStore.EXTRA_OUTPUT, outPutFile);
据说在Camera应用程序,有如何处理返回值data问题!人家是这么玩的--->默认情况下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);照相机有自己默认的存储路径,但是如果指定了目标uri,data就没有数据,如果没有指定uri,则data就返回有数据!这是真的。然后我改成这个模样了--->
if(requestCode==1){                InputStream inputStream = null;                try {                    inputStream = getContentResolver().openInputStream(outPutFile);                    //通过输入流得到bitmap对象                    BitmapFactory.Options opts = new BitmapFactory.Options();                    opts.inSampleSize = 4;                    bitmap = BitmapFactory.decodeStream(inputStream,null,opts);                    filePath=getPath.getPath(this,outPutFile);                } catch (FileNotFoundException e) {                    e.printStackTrace();                }            }else {                return;//当data为空的时候,不做任何处理            }
然后暂时还没发现什么问题。这只是我的笔记,不是技术贴,所以不严谨,有问题欢迎讨论。大笑

1 0