Android 点击按钮调用系统照相机

一直觉得手机上的照相功能很强大,了解源码之后,就越来越喜欢了,啥也不说了,直接上代码……


Intent intent = new Intent(); 
intent.setAction("android.media.action.STILL_IMAGE_CAMERA");   
startActivity(intent);


布局就是一个简单的GridView,添加的时候千万记住,对照片进行处理,不然会OOM。


publicclass MainActivity extends Activity {

    privatestatic final String tag = "MainActivity";
    private static final intCAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;

    private static final intPICK_IMAGE_ACTIVITY_REQUEST_CODE = 200;

   @Override
    protected void onCreate(BundlesavedInstanceState) {

       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

      //点击打开照相机按钮进行拍照

       Button button = (Button) this.findViewById(R.id.open_camera);
        button.setOnClickListener(newView.OnClickListener() {

           @Override
           public void onClick(View v) {
               takePicture();
           }
        });

 

       //点击打开相册跳转到一个布局为grideView的界面里

 

       Button pickImageBtn = (Button) this.findViewById(R.id.pick_image);
       pickImageBtn.setOnClickListener(new View.OnClickListener() {

           @Override
           public void onClick(View v) {
               Intent intent = new Intent(MainActivity.this, PictureActivity.class);
               startActivity(intent);
           }

       });

    }

    privatestatic String picFileFullName;

    // 拍照
    public void takePicture() {

        Stringstate = Environment.getExternalStorageState();
        if(state.equals(Environment.MEDIA_MOUNTED)) {
           Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
           File outDir =Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
           if (!outDir.exists()) {
               outDir.mkdirs();
           }
           File outFile = new File(outDir, System.currentTimeMillis() + ".jpg");
           picFileFullName = outFile.getAbsolutePath();
           intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outFile));
           intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
           startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
        } else{
           Log.e(tag, "请确认已经插入SD卡");
        }

    }

   @Override
    protected voidonActivityResult(int requestCode, int resultCode, Intent data) {

       super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
           if (resultCode == RESULT_OK) {
               Log.e(tag, "获取图片成功,path="+ picFileFullName);
               toast("
获取图片成功,path=" +picFileFullName);
               setImageView(picFileFullName);

           } else if (resultCode == RESULT_CANCELED) {
               // 用户取消了图像捕获
           } else {

               // 图像捕获失败,提示用户
               Log.e(tag, "
拍照失败");
           }

        } elseif (requestCode == PICK_IMAGE_ACTIVITY_REQUEST_CODE) {
           if (resultCode == RESULT_OK) {
               Uri uri = data.getData();
               if (uri != null) {
                   String realPath = getRealPathFromURI(uri);
                   Log.e(tag, "获取图片成功,path="+ realPath);
                   toast("
获取图片成功,path=" + realPath);
                   setImageView(realPath);

               } else {
                   Log.e(tag, "从相册获取图片失败");
               }

           }
        }
    }

    privatevoid setImageView(String realPath) {
        Bitmapbmp = BitmapFactory.decodeFile(realPath);

        intdegree = readPictureDegree(realPath);
       Log.e(tag, "rotate:" + degree);
        // 创建操作图片是用的matrix对象
        Matrixmatrix = new Matrix();

        // 旋转图片动作
       matrix.postRotate(degree);

    }

    /**
     * This method is used toget real path of file from from uri<br/>

     * captured-from-camera
     * 
     * @param contentUri
     * @return String
     */
    public StringgetRealPathFromURI(Uri contentUri) {
        try {
           String[] proj = { MediaStore.Images.Media.DATA };
           Cursor cursor = this.managedQuery(contentUri, proj, null, null, null);
           int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
           cursor.moveToFirst();
           return cursor.getString(column_index);
        } catch(Exception e) {
           return contentUri.getPath();
        }
    }

    /**
     *
读取照片exif信息中的旋转角度<br/> 
     * @param path

    *            照片路径
     * @return
角度
     */

    public static intreadPictureDegree(String path) {
        intdegree = 0;
        try {
           ExifInterface exifInterface = new ExifInterface(path);
           int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                   ExifInterface.ORIENTATION_NORMAL);
           switch (orientation) {
           case ExifInterface.ORIENTATION_ROTATE_90:
               degree = 90;
               break;
           case ExifInterface.ORIENTATION_ROTATE_180:
               degree = 180;
               break;
           case ExifInterface.ORIENTATION_ROTATE_270:
               degree = 270;
               break;
           }
        } catch(IOException e) {
           e.printStackTrace();
        }
        returndegree;
    }

    publicvoid toast(String msg) {
       Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();

    }
}


public classPictureActivity extends Activity {
    private GridView gridview;
    private GrideViewAdapter adapter;
    private List<Bitmap> tupian = newArrayList<Bitmap>();
    String img_path = "/storage/emulated/0/Pictures/";
    File file = new File(img_path);
    Bitmap bitmap;
    Bitmap bitmaps;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_picture);
        getAllFiles(file);
        adapter = newGrideViewAdapter(PictureActivity.this, tupian);
        gridview = (GridView)findViewById(R.id.gridview);
        gridview.setAdapter(adapter);
        Log.d("PictureActivity","
图片长度" + tupian.size());
    }

    private void getAllFiles(File root) {
        File files[] = root.listFiles();
        Options opts = new Options();
        opts.outHeight = 200;
        opts.outWidth = 200;
        if (files != null) {
            for (int i =0; i < files.length; i++) {
               if (files[i].isFile()) {
                   bitmap = BitmapFactory.decodeFile(files[i].toString(), opts);
                   bitmaps = Bitmap.createScaledBitmap(bitmap, 200, 200, false);
                   //
先判断图片是否已释放了
                   if (!bitmap.isRecycled()) {
                       bitmap.recycle();
                       tupian.add(bitmaps);
                   }
                   Log.d("PictureActivity", "files" + files.length);
               }
            }
        }
    }

}

 


public classGrideViewAdapter extends BaseAdapter {
    private final static String TAG ="GrideViewAdapter";
    Context context;
    List<Bitmap> tupian;
    private LayoutInflater inflater = null;
    Uri uri;

    public GrideViewAdapter(Context context,List<Bitmap> tupian) {
        this.context = context;
        this.tupian = tupian;
        Log.d(TAG, "List size:" +tupian.size());
    }

    @Override
    public int getCount() {

        return tupian.size();
    }

    @Override
    public Object getItem(int position) {

        returntupian.get(position);
    }

    @Override
    public long getItemId(int position) {

        return position;
    }

    @Override
    public View getView(int position, View convertView,ViewGroup parent) {
        Holder holder;
        if (convertView == null) {
            inflater =LayoutInflater.from(context);
            convertView= inflater.inflate(R.layout.gride_item, null);
            holder = newHolder();
           holder.im_item = (ImageView) convertView.findViewById(R.id.im_item);
           convertView.setTag(holder);
        } else {
            holder =(Holder) convertView.getTag();
        }
       holder.im_item.setImageBitmap(tupian.get(position));
        return convertView;
    }

    private class Holder {
        ImageView im_item;
    }

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个小狼娃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值