您的位置:首页 > 移动开发 > Android开发

Android实现照片选择显示-从相册选择或拍照选择

2014-04-04 18:05 543 查看
需要上传图片的地方的都会有图片选择这项功能,Android当然也可以实现,下面我主要说下最普通寻常的功能,从相册选择图片或拍照,并将图片显示出来。由于这个小功能代码简单,直接贴代码,大家参考下吧。

这次又是无图无真相,不过代码可以直接run起来、

public class PhotoChooser extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //以下是界面布局,没有在xml界面中,直接new出来了

        LinearLayout allLayout = new LinearLayout(this);
        allLayout.setOrientation(LinearLayout.VERTICAL);

        LinearLayout buttonLine = new LinearLayout(this);
        Button choose1 = new Button(this);
        Button choose2 = new Button(this);
        choose1.setText("相册选取");
        choose2.setText("拍照选取");
        choose1.setOnClickListener(new View.OnClickListener() {
            //打开相册选取
            @Override
            public void onClick(View v) {
                Intent it = new Intent();
                it.setType("image/*");
                it.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(it, 2);
            }
        });
        choose2.setOnClickListener(new View.OnClickListener() {
            //打开照相机拍照选取
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, 1);
            }
        });
        buttonLine.addView(choose1);
        buttonLine.addView(choose2);

        imageView = new ImageView(this);
        imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);

        allLayout.addView(buttonLine);
        allLayout.addView(imageView);

        setContentView(allLayout);

        scale = getResources().getDisplayMetrics().density;
    }

    ImageView imageView;
    float scale;

    //这个方法我只知道是为了适应不同屏幕的显示,具体还真不理解,先用着吧
    public int getPixel(int old) {
        return (int) (old * scale + 0.5f);
    }

    //由于Intent使用的是 startActivityForResult,调用此回调方法接受返回数据,即照片。
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (data != null) {
            Uri mImageCaptureUri = data.getData();
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(getPixel(300), getPixel(250));
            params.setMargins(0, 15, 0, 15);
            if (mImageCaptureUri != null) {
                try {
                    //这个方法是根据Uri获取Bitmap图片的静态方法
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), mImageCaptureUri);
                    // 获取屏幕分辨率
                    DisplayMetrics dm_2 = new DisplayMetrics();
                    getWindowManager().getDefaultDisplay().getMetrics(dm_2);
                    // 图片分辨率与屏幕分辨率比例
                    float scale_2 = bitmap.getWidth() / (float) dm_2.widthPixels;

                    Bitmap newBitMap = null;
                    if (scale_2 > 1) {
                        newBitMap = zoomBitmap(bitmap, bitmap.getWidth()
                                / scale_2, bitmap.getHeight() / scale_2);
                        bitmap.recycle();
                    }

                    if (newBitMap != null) {
                        imageView.setImageBitmap(newBitMap);
                    } else {
                        imageView.setImageBitmap(bitmap);
                    }
                    imageView.setLayoutParams(params);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                Bundle extras = data.getExtras();
                if (extras != null) {
                    //这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片
                    Bitmap image = extras.getParcelable("data");
                    if (image != null) {
                        imageView.setImageBitmap(image);
                        imageView.setLayoutParams(params);
                    }
                }
            }

        }
    }

    // 对分辨率较大的图片进行缩放
    public Bitmap zoomBitmap(Bitmap bitmap, float width, float height) {

        int w = bitmap.getWidth();

        int h = bitmap.getHeight();

        Matrix matrix = new Matrix();

        float scaleWidth = ((float) width / w);

        float scaleHeight = ((float) height / h);

        matrix.postScale(scaleWidth, scaleHeight);// 利用矩阵进行缩放不会造成内存溢出

        Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);

        return newbmp;

    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐