`
263229365
  • 浏览: 473552 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android条用照相机,实现可剪切功能

 
阅读更多

 

public class CameraActivity extends Activity {

CameraView cameraView;

Button btnOpenCamera, btnShowPhoto, btnHelp;

int markView = 0;

boolean isMarkImageShow = false;

/*用来标识请求照相功能的activity*/  

    private static final int CAMERA_WITH_DATA = 3023;  

 

    /*用来标识请求gallery的activity*/  

    private static final int PHOTO_PICKED_WITH_DATA = 3021;  

 

    private File mCurrentPhotoFile;//照相机拍照得到的图片  

 

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

// requestWindowFeature(Window.FEATURE_NO_TITLE);

// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

// WindowManager.LayoutParams.FLAG_FULLSCREEN);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

setContentView(R.layout.camera);

cameraView = new CameraView(this);

initButtons();

}

public void initButtons(){

btnOpenCamera = (Button)findViewById(R.id.camera_open);

btnShowPhoto = (Button)findViewById(R.id.camera_show_photo);

btnHelp = (Button)findViewById(R.id.camera_help);

btnOpenCamera.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

// setContentView(cameraView);

// cameraView.requestFocus();

// cameraView.setFocusable(true);

// Intent intent = new Intent();

// intent.setClass(CameraActivity.this, CameraOpenActivity.class);

// intent.setAction("android.media.action.STILL_IMAGE_CAMERA");

// startActivity(intent);

doTakePhoto();

}

});

btnShowPhoto.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

// Intent intent = new Intent();

// intent.setClass(CameraActivity.this, ShowPictureActivity.class);

// startActivity(intent);

// finish();

doPickPhotoFromGallery();

}

});

btnHelp.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

}

});

}

 

/**

* 拍照获取图片

*/

protected void doTakePhoto() {

String path = Environment.getExternalStorageDirectory()

.getAbsolutePath() + File.separator + "ToolBoxfiles";

File dir = new File(path);

if (!dir.exists()) {

dir.mkdirs();

}

if (dir.exists()) {

try {

Date date = new Date(System.currentTimeMillis());

SimpleDateFormat dateFormat = new SimpleDateFormat(

"'IMG'_yyyy-MM-dd_HH-mm-ss");

String fileName = dateFormat.format(date) + ".jpg";

mCurrentPhotoFile = new File(path, fileName);

 

Uri u = Uri.fromFile(mCurrentPhotoFile);

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE,

null);

intent.putExtra(MediaStore.EXTRA_OUTPUT, u);

startActivityForResult(intent, CAMERA_WITH_DATA);

} catch (Exception e) {

// TODO: handle exception

Toast.makeText(this, "--doTakePhoto--", Toast.LENGTH_LONG).show();

}

}

}

protected void doCropPhoto(File f) {

try {

// 启动gallery去剪辑这个照片

final Intent intent = getCropImageIntent(Uri.fromFile(f));

startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);

} catch (Exception e) {

Toast.makeText(this, "--doCropPhoto--", Toast.LENGTH_LONG).show();

}

}

 

/**

* Constructs an intent for image cropping. 调用图片剪辑程序

*/

public static Intent getCropImageIntent(Uri photoUri) {

Intent intent = new Intent("com.android.camera.action.CROP");

intent.setDataAndType(photoUri, "image/*");

intent.putExtra("crop", "true");

intent.putExtra("aspectX", 1);

intent.putExtra("aspectY", 1);

intent.putExtra("outputX", 80);

intent.putExtra("outputY", 80);

intent.putExtra("return-data", true);

return intent;

}

 

// 请求Gallery程序

protected void doPickPhotoFromGallery() {

try {

// Launch picker to choose photo for selected contact

final Intent intent = getPhotoPickIntent();

startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);

} catch (ActivityNotFoundException e) {

Toast.makeText(this, "doPickPhotoFromGallery",

Toast.LENGTH_LONG).show();

}

}

 

// 封装请求Gallery的intent

public static Intent getPhotoPickIntent() {

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);

intent.setType("image/*");

intent.putExtra("crop", "true");

intent.putExtra("aspectX", 1);

intent.putExtra("aspectY", 1);

intent.putExtra("outputX", 80);

intent.putExtra("outputY", 80);

intent.putExtra("return-data", true);

return intent;

}

 

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

if (resultCode != RESULT_OK)  

            return;  

        switch (requestCode) {  

            case PHOTO_PICKED_WITH_DATA: {// 调用Gallery返回的  

                final Bitmap photo = data.getParcelableExtra("data");  

 

//                ImageView imageView = new ImageView(this);

                ImageView imageView = (ImageView) findViewById(R.id.imageView);

                imageView.setImageBitmap(photo);

//                this.setContentView(imageView);

//                isMarkImageShow = true;

 

                // 下面就是显示照片了  

//                System.out.println(photo);  

                //缓存用户选择的图片  

//                img = getBitmapByte(photo);  

//                mEditor.setPhotoBitmap(photo);  

//                System.out.println("set new photo");  

                break;  

            }  

            case CAMERA_WITH_DATA: {// 照相机程序返回的,再次调用图片剪辑程序去修剪图片  

                doCropPhoto(mCurrentPhotoFile);  

 

                break;  

            }  

        }  

}

 

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

}

 

@Override

    public boolean onKeyDown(int keyCode, KeyEvent event) {

    if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){

    if(isMarkImageShow){

//     isMarkImageShow = false;

//     this.setContentView(R.layout.camera);

   

    }else{

    Intent intent = new Intent();

    intent.setClass(CameraActivity.this, ToolBoxActivity.class);

    startActivity(intent);

    finish();

    }

   

    return true;

    }

    return super.onKeyDown(keyCode, event);

    }

}

 

 

 

 

自己写的照相机,还有待改进

 

public class CameraOpenActivity extends Activity {

/** Called when the activity is first created. */

private SurfaceView surfaceView;

private Button buttonTakePhoto, buttonGoBack, buttonShowPicture;

private Camera camera;

 

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 设置横屏

// this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_BEHIND);// 设置横屏

// requestWindowFeature(Window.FEATURE_NO_TITLE);// 没有标题

// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

// WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏

// getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,

// WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 屏幕亮度的持续

 

setContentView(R.layout.camera_open);

 

surfaceView = (SurfaceView) this.findViewById(R.id.surface_view);

// surfaceView.set

surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

// surface.getHolder().setFixedSize(176, 144);

surfaceView.getHolder().addCallback(new SurfaceCallback());

 

initButtons();

}

 

public void initButtons() {

buttonTakePhoto = (Button) findViewById(R.id.button_take_photo);

buttonTakePhoto.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

// 停止预览

takePic();

}

});

 

buttonShowPicture = (Button) findViewById(R.id.button_show_picture);

buttonShowPicture.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

 

}

});

buttonGoBack = (Button) findViewById(R.id.button_go_back);

buttonGoBack.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

Intent intent = new Intent();

intent.setClass(CameraOpenActivity.this, CameraActivity.class);

startActivity(intent);

finish();

}

});

 

}

 

private class SurfaceCallback implements Callback {

 

@Override

public void surfaceCreated(SurfaceHolder holder) {

// TODO Auto-generated method stub

camera = Camera.open();

try {

camera.setPreviewDisplay(holder);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

// TODO Auto-generated method stub

// 获取相机参数

Camera.Parameters parameters = camera.getParameters();

// 设置照片大小

parameters.setPreviewSize(width, height);

// 设置照片格式

parameters.setPictureFormat(PixelFormat.JPEG);

// 设置相机参数

camera.setParameters(parameters);

camera.startPreview();

}

 

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// TODO Auto-generated method stub

// 停止预览

camera.stopPreview();

// 释放相机资源

if (camera != null)

camera.release();

camera = null;

}

}

 

// 执行保存照片任务

Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {

@Override

public void onPictureTaken(byte[] data, Camera camera) {

// TODO Auto-generated method stub

new SavePictureTask().execute(data);

camera.startPreview();

}

};

 

class SavePictureTask extends AsyncTask<byte[], String, String> {

 

@Override

protected String doInBackground(byte[]... params) {

// TODO Auto-generated method stub

String path = Environment.getExternalStorageDirectory()

.getAbsolutePath() + File.separator + "ToolBoxfiles";

File dir = new File(path);

if (!dir.exists()) {

dir.mkdirs();

}

if (dir.exists()) {

try {

File file = new File(path, System.currentTimeMillis()

+ ".jpg");

FileOutputStream outputStream = new FileOutputStream(file);

outputStream.write(params[0]);

outputStream.close();

camera.startPreview();

} catch (Exception e) {

// TODO: handle exception

}

}

 

return null;

}

 

}

 

// 拍照方法

public void takePic() {

// 停止预览

camera.stopPreview();

// 拍照

camera.takePicture(null, null, pictureCallback);

}

 

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

}

 

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

Intent intent = new Intent();

intent.setClass(CameraOpenActivity.this, CameraActivity.class);

startActivity(intent);

finish();

return true;

}

return super.onKeyDown(keyCode, event);

}

}


分享到:
评论
1 楼 leecinwell 2014-10-14  
   

相关推荐

    Android自定义照相机实现只拍摄矩形区域(重传)

    在Android开发中,有时我们需要对系统默认的相机功能进行扩展,以满足特定的拍摄需求,例如只拍摄画面中的矩形区域。这样的自定义相机功能可以应用于各种场景,比如二维码扫描、文档拍摄等,确保用户每次拍摄都能...

    Android实现自定义照相机

    在Android平台上,自定义相机是一项常见的功能,它允许开发者根据特定需求定制相机界面和功能,以提供更加个性化和丰富的用户体验。下面将详细讲解如何在Android中实现自定义相机。 首先,你需要创建一个新的`...

    android 调用系统照相机功能

    在Android应用开发中,调用系统照相机功能是常见的需求,允许用户拍摄照片或录制视频。下面我们将深入探讨如何实现这一功能。 首先,我们需要在AndroidManifest.xml文件中添加权限,以便应用可以访问摄像头: ```...

    Android自定义照相机实现.docx编程资料

    - **IDE**: 推荐使用Android Studio作为开发环境,它提供了强大的编辑器和支持功能。 - **Camera API**: Android系统提供的用于控制摄像头硬件的API。 - **MediaStore API**: 用于管理设备上的媒体文件,如图片和...

    android 简易camera照相机

    这个"android 简易camera照相机"项目旨在提供一个基础的拍照和预览功能。下面将详细解释如何实现这些功能,以及涉及到的关键知识点。 首先,Android中的Camera API分为两代:Camera API1和Camera API2。Camera API1...

    Android4.0.3照相机源码

    在Android 4.0.3(Ice Cream Sandwich)版本中,照相机功能是系统的核心组件之一,对于开发者来说,理解其源码可以帮助我们深入学习Android系统以及如何构建高性能、功能丰富的相机应用。以下是对Android 4.0.3照相机...

    android照相机应用源码

    6. **权限管理:**在Android 6.0及以上版本,使用相机功能需要动态请求CAMERA权限。 7. **用户界面:**设计一个友好的UI至关重要,包括拍照按钮、切换前后摄像头的选项、闪光灯开关等。 8. **兼容性处理:**由于...

    android7.0内核照相机源码

    在Android 7.0系统中,照相机功能的实现依赖于其内核源码,这部分代码提供了对硬件接口的直接访问,以及与上层应用程序框架交互的机制。本主题主要探讨的是Android系统的照相机服务(Camera Service)和相关组件的...

    Android 调用系统相册和系统照相机功能雨实例源码.zip

    本文将详细介绍如何在Android中实现这两个功能,并提供相应的源码实例。 首先,我们来看如何调用系统相册。在Android中,我们可以使用`Intent`来启动系统相册应用,让用户选择图片。以下是一个简单的示例: ```...

    Android对焦拍照功能实现

    在Android应用开发中,实现对焦和拍照功能是常见的需求,尤其在开发摄影类或社交类应用时。本文将详细讲解如何在Android中实现在点击屏幕后进行对焦并拍照的功能。 首先,我们需要理解Android的相机API。Android...

    android照相机相册选择,可以多选

    本项目标题为“android照相机相册选择,可以多选”,说明它实现了在Android平台上让用户能够通过自定义的方式,不仅能够使用相机拍摄照片,还能够从相册中选取多张图片,并且具备删除已选择图片的功能。这一特性极大...

    android4.0 Camera照相机 源代码

    总之,这个“android4.0 Camera照相机 源代码”压缩包提供了Android 4.0时代相机功能实现的详细示例,对于深入学习Android Camera API和开发相关应用具有很高的参考价值。通过研究这些源代码,开发者能够更好地理解...

    Android编写的照相机

    这个"Android编写的照相机"项目是一个基础的Demo,旨在帮助初学者理解如何在Android应用程序中集成相机功能。下面,我们将详细探讨这个Demo实现的关键知识点以及可能的扩展方向。 首先,我们要知道在Android中访问...

    android4.0 camera 照相机代码jar包

    在Android开发中,照相机功能是用户非常常用且重要的特性之一。在Android 4.0(API Level 14)时,系统对相机API进行了重大更新,提供了更强大的功能和更好的性能。本压缩包文件“android4.0 camera 照相机代码jar包...

    android调用照相机拍照与选择本地照片功能

    在Android应用开发中,提供用户调用照相机拍照...以上就是关于“android调用照相机拍照与选择本地照片功能”的核心知识点,开发者在实现这些功能时,需要注意优化用户体验,合理管理文件,以及遵循Android的最佳实践。

    基于android的简易照相机源码.zip

    综上所述,这个简易照相机应用的实现涉及到了Android相机API的使用、兼容性处理、用户界面设计、多媒体文件存储、权限管理等多个重要技术点。通过深入理解和实践这些知识点,开发者可以构建出功能丰富的移动摄影应用...

    android 照相机 demo

    android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo

    Android源码——调用系统相册和系统照相机功能雨实例源码.zip

    本文将详细解析如何在Android应用中实现这两个功能,并提供相关的源码实例。 首先,调用系统相册的功能是允许用户从手机存储中选择图片。这通常通过Intent的ACTION_PICK操作来实现。在AndroidManifest.xml中,确保...

    android里面cemera照相机的运行流程

    在Android系统中,相机服务(Camera Service)是整个相机功能的核心,它负责管理硬件资源,提供API供应用程序调用,并处理图像数据的捕获与处理。这篇详尽的"android里面cemera照相机的运行流程"框架研究文档,将...

Global site tag (gtag.js) - Google Analytics