MainActivity.java:
package com.canmera.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button button_openCanmera, button_openAlbum, button_gaoQing;
private ImageView imageView;
private String imageUrl = "";// 要打开的图片的路径
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
setListeners();
}
private void findViews() {
// TODO Auto-generated method stub
button_openCanmera = (Button) findViewById(R.id.button1);
button_openAlbum = (Button) findViewById(R.id.button2);
button_gaoQing = (Button) findViewById(R.id.button3);
imageView = (ImageView) findViewById(R.id.imageView1);
}
private void setListeners() {
// TODO Auto-generated method stub
button_openCanmera.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 调用相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 2);
}
});
// 这种方法保存的图片质量好点
button_gaoQing.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 调用相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 拍完照片之后保存的路径(文件名)
String path = "/sdcard/myImage/gaoQing.png";
// 加上这个后,图片就不会被压缩变小了
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(path)));
startActivityForResult(intent, 1);
}
});
//打开相册
button_openAlbum.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// Intent intent = new
// Intent(MainActivity.this,SDCARD123Activity.class);
// startActivity(intent);
Intent intent = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent, 1);
// startActivityForResult(Intent.createChooser(intent,
// "Pick any photo"), 1);
}
});
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if("".equals(imageUrl)){
Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent, 1);
}else{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(imageUrl)),"image/*");
startActivity(intent);
}
}
});
}
// 相机的回调函数
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (data != null && data.getExtras() != null) {// 普通的拍照
saveImage(requestCode, resultCode, data);
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(bitmap);
} else if (data != null && data.getData() != null) {// 打开相册回调函数
String imagePath = getImagePath(data);
imageUrl = imagePath;
imageView.setImageBitmap(BitmapFactory.decodeFile(imagePath, null));
} else {// 获取高清图片的方法
imageUrl = "/sdcard/myImage/gaoQing.png";
imageView.setImageBitmap(BitmapFactory.decodeFile(imageUrl, null));
}
}
// 保存图片到sd卡(保存的图片不清晰)
private void saveImage(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {// 检查sd卡是否可用
Toast.makeText(this, "SD卡不可用", Toast.LENGTH_LONG).show();
return;
}
new File("/sdcard/myImage/").mkdirs();// 创建文件夹
OutputStream outputStream = null;
try {
String imagePath = "/sdcard/myImage/11.png";
outputStream = new FileOutputStream(imagePath);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);// 把数据写入文件quality的值0...100
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
if (bitmap != null) {
bitmap.recycle();//清理图片内存
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 返回图片的绝对路径
private String getImagePath(Intent data) {
// TODO Auto-generated method stub
Uri uri = data.getData();// 可以得到图片在Content://。。。中的地址,把它转化成绝对地址如下
String[] proj = { MediaStore.Images.Media.DATA };
String imagePath = "";
Cursor cursor = managedQuery(uri, proj,null, null, null);// 查哪一列
if (cursor != null) {
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (cursor.getCount() > 0 && cursor.moveToFirst()) {
imagePath = cursor.getString(column_index);
}
}
return imagePath;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
manifest.xml:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
分享到:
相关推荐
### Android Camera相机程序知识点 #### 一、Camera启动与初始化 **1. Activity启动流程** 在Android Camera程序中,活动(Activity)的启动流程遵循标准的生命周期管理方式:`onCreate()`→`onStart()`→`onResume...
Android camera整体框架介绍
在Android平台上,Camera类是开发者用来访问和控制设备相机功能的核心接口。这个API允许我们启动相机,捕获静态图片,录制视频,以及调整各种拍摄参数。Android Camera API分为两个主要版本:Camera1(旧版)和...
Android提供了两种主要的方式来实现相机功能:调用系统相机(Intent)和自定义相机(Camera API)。这两种方法各有优缺点,适用于不同的场景。 ### 一、调用系统相机(Intent) 通过Intent调用系统相机是最简单的...
Android Camera API提供了丰富的接口和工具,使得开发者可以构建自己的相机应用,实现拍照、录像以及自定义对焦等功能。本文将深入探讨Android相机源码中的关键知识点。 首先,我们需要了解Android Camera API的...
这两个MHT文件可能包含了对Android开源项目中Camera组件的源码分析,可能涉及了相机服务的实现、框架层与硬件抽象层的交互,以及如何在不同设备上适配相机功能。 4. **Android的IPC机制Binder的各个部分**: 这两...
因为工作中要使用 Android Camera2 API 来实现相机功能,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,这个项目就是我研究的成果。 其中包括一个自己写的Camera2的Demo...
这个“简易camera相机”很可能基于Camera API1,因为它是更简单的选择,适合初学者学习。 1. **初始化Camera**:在Android中,要使用Camera,首先要通过`Camera.open(int cameraId)`方法打开特定的摄像头。cameraId...
在提供的压缩包文件AndroidCamera-EnableSettings-master中,可能包含了实现以上步骤的示例代码,通过学习和分析这些代码,你可以更好地理解和实践Android相机开发。 总的来说,Android相机开发涉及多方面知识,...
Camera API是Android早期提供的相机接口,虽然现在已经被推荐使用Camera2 API,但在某些低版本系统中仍然适用。Camera API主要通过`Camera`类来控制摄像头,提供了拍照、预览和录像等功能。而Camera2 API则是Android...
在Android平台上,自定义相机(Custom Camera)是一个常见的需求,涉及到对系统相机API的深入理解和应用。本主题将详述如何在Android中构建一个自定义的相机应用,涵盖关键概念、步骤以及可能遇到的问题。 一、...
在Android平台上,自定义相机开发是一项常见的任务,Camera2 API是Google为了提供更高级、更灵活的相机控制而引入的接口。本教程将深入探讨如何使用Camera2 API创建一个自定义相机应用,通过分析提供的OneSelfCamera...
本文将深入探讨`android-Camera-Code.zip`中的相机应用示例,以及如何在Eclipse环境中进行导入和编译。这个压缩包包含了一个完整的Android相机工程,提供了对Android相机API的直观理解和实际操作。 ### 相机API简介...
这个压缩包文件包含了Android 4.0 Camera应用层的源代码,对于想要深入理解Android Camera工作原理和开发自定义相机应用的开发者来说,是一个宝贵的学习资源。 首先,我们来了解一下Android Camera的基本结构。在...
这个库包括`androidx.camera.core`、`androidx.camera.lifecycle`和`androidx.camera.view`等模块,分别处理相机核心功能、生命周期管理和用户界面组件。 1. **初始化与配置** AndroidX Camera库的初始化通常在...
本文将深入探讨如何利用`android.hardware.camera` API来构建一个自定义相机应用,并结合SurfaceView进行预览显示。 首先,我们需要了解`Camera`类是Android系统提供的核心组件,用于与设备的物理相机硬件进行交互...
在Android API 14及以上版本,系统提供了Camera2 API,这是一个更强大且灵活的接口,用于控制相机硬件。对于较旧的设备,可以使用Camera API。无论选择哪个API,我们都需要处理捕获的每一帧数据,并在此基础上添加...
1. **Camera API**(旧版):这是早期Android系统中提供的相机接口,简单易用,但功能相对有限,不支持高级定制和硬件级别的控制。 2. **Camera2 API**:自Android 5.0(Lollipop)开始引入,提供了更全面的相机...
在Android开发中,自定义相机(Camera)是一个常见的需求,特别是在开发涉及图像处理或拍照功能的应用时。Android原生提供了Camera API,但直接使用可能会遇到一些问题,如图像拉伸、拍照翻转等。本教程将详细介绍...
android camera mirror 前置后置相机视频预览时左右镜像,实现镜子效果 基于以下网址实现的android studio项目源代码包,可以直接打开使用 https://blog.csdn.net/mbrose/article/details/80167781 代码做了一...