android调用系统的相机服务
本功能实现的是调用相机拍照,并利用img标签显示:
思路一:拍照时刻进行保存
package com.bobo.mypic; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import com.bobo.util.BitmapUtil; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends Activity { private Button btn_takePic; private Button btn_fromPic; private File mediaFile; private int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0; private ImageView img_view; private Button btn_jump; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_takePic = (Button) this.findViewById(R.id.btn_takePic); btn_fromPic = (Button) this.findViewById(R.id.btn_viewPic); btn_takePic.setOnClickListener(new TakePicListener()); img_view = (ImageView) this.findViewById(R.id.img_viewPic); btn_jump = (Button) this.findViewById(R.id.btn_jump); btn_jump.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(); intent.setClass(MainActivity.this, SecondActivity.class); startActivity(intent); } }); } class TakePicListener implements View.OnClickListener { @Override public void onClick(View arg0) { takePhoto(); } } private void takePhoto() { if (!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { return; } File file = new File( Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator + "shareImg"); if (!file.exists()) { if (!file.mkdirs()) return; } String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") .format(new Date()); mediaFile = new File(file.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); Uri fileUri = Uri.fromFile(mediaFile); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == this.CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { long len = mediaFile.length(); if (len == 0) { mediaFile = null; return; } // 从文件中加载位图 System.out.println("文件存储路径:" + mediaFile.getPath()); Bitmap bitmap = new BitmapUtil().loadBitmap(mediaFile.getPath()); img_view.setImageBitmap(bitmap); } } }
其中,从文件中加载位图的代码如下:
若是由于图片本身较大,直接用Widge中的图片控件打不开,但通过BitmapFactory.Options的inJustDecodeBounds和inSampleSize可以压缩打开,但是在通过手势放大的时候,图片本身就不是很清晰。
package com.bobo.util; import java.io.FileOutputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; public class BitmapUtil { // 从文件中加载位图 public Bitmap loadBitmap(String path) { //这样可以显示,但是图片的质量很差 BitmapFactory.Options opts = new Options(); opts.inJustDecodeBounds = true; // 告诉解析�?不要真的去解析图�?只是把图片的宽高信息给提供出�? BitmapFactory.decodeFile(path, opts); int width = opts.outWidth; int height = opts.outHeight; // 得到手机屏幕的宽高信�? int windowwidth = 50; int windowheigth = 50; int scalex = width / windowwidth; int scaley = height / windowheigth; if (scalex > scaley && scaley > 1) { // 水平方向的缩放比例比较大 opts.inSampleSize = scalex; } if (scaley > scalex && scalex > 1) { // 竖直方向的缩放比例比较大 opts.inSampleSize = scaley; } opts.inJustDecodeBounds = false; // 告诉解析�?按照 opts.inSampleSize 比例真实的返回位�? Bitmap bitmap = BitmapFactory.decodeFile(path, opts); return bitmap; } }
思路二,在activity的onactivityResult方法中进行保存
package com.bobo.mypic; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; import com.bobo.mypic.MainActivity.TakePicListener; import com.bobo.util.BitmapUtil; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.text.format.DateFormat; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class SecondActivity extends Activity { private Button btn_takePic; private Button btn_fromPic; private File mediaFile; private int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 1; private ImageView img_view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_takePic = (Button) this.findViewById(R.id.btn_takePic); btn_fromPic = (Button) this.findViewById(R.id.btn_viewPic); btn_takePic.setOnClickListener(new TakePicListener()); img_view = (ImageView) this.findViewById(R.id.img_viewPic); } class TakePicListener implements View.OnClickListener { @Override public void onClick(View arg0) { takePhoto(); } } public void takePhoto() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { String sdStatus = Environment.getExternalStorageState(); if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用 Log.i("TestFile", "SD card is not avaiable/writeable right now."); return; } String name = new DateFormat().format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg"; Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式 FileOutputStream b = null; File file = new File("/sdcard/myImage/"); file.mkdirs();// 创建文件夹 String fileName = "/sdcard/myImage/" + name; try { b = new FileOutputStream(fileName); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件 } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { b.flush(); b.close(); } catch (IOException e) { e.printStackTrace(); } } ((ImageView) findViewById(R.id.img_viewPic)).setImageBitmap(bitmap);// 将图片显示在ImageView里 } } }