『壹』 1銆佸畨鍗撹皟鐢ㄦ憚鍍忓ご鎷嶇収
杩戞湡鍦ㄥ仛姣曡撅紝闇瑕佺敤鍒癆ndroid璋冪敤鎽勫儚澶存媿鎽勮溅鐗屽彿锛屽苟瀵硅溅鐗屽彿鐮佽繘琛岃瘑鍒銆傜壒鍒璁板綍涓涓嬪備綍璋冪敤绯荤粺鎽勫儚澶磋繘琛屾媿鐓,骞跺皢鏂囦欢淇濆瓨鍒版湰鍦般
鐜澧冿細Android Studio
瀹樻柟鎸囧崡锛 Camera|Android Developer
1銆侀栧厛褰撶劧瑕佹坊鍔犱竴涓嬭皟鐢ㄦ憚鍍忓ご闇瑕佺殑鏉冮檺锛屼互鍙婂垱寤烘枃浠堕渶瑕佺殑鏉冮檺绛
AndroidMainfest.xml
2銆佹坊鍔犲嚱鏁帮紝鍒涘缓涓存椂鏂囦欢锛岀敤鏉ュ偍瀛樺浘鐗
MainActivity.java
3銆佸垱寤哄嚱鏁扮敤鏉ュ惎鍔ㄦ憚鍍忓ご锛屽苟鍌ㄥ瓨鏂囦欢
MainActivity.java
4銆佸洜涓轰笂闈浣跨敤鍒皃rivider锛屽洜姝ら渶瑕佸湪res涓嬪垱寤簒ml鏂囦欢澶广佸垱寤烘枃浠秄ile_paths.xml,骞舵坊鍔犲瑰簲鐨勮剧疆
file_paths.xml
AndroidMainfest.xml
5銆佸湪onCreate()涓璋冪敤dispatchTakePictureIntent()鍑芥暟
MainActivity.java
鍏朵繚瀛樼殑鏂囦欢鐩褰曞備笅锛
/storage/emulated/0/Android/data/com.example.takephotos/files/Pictures/JPEG_20190312_2339464476956325377028564.jpg
瀹夊崜鎷嶇収骞朵笖淇濆瓨鏈鍦板氨鍒拌繖閲屽畬鎴愪簡銆
『贰』 Android 使用系统相机拍照和读取相册照片
1.拍照 (对于7.0以上的版本,不在允许直接访问uri)
`
若不指定输出路径intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri(srcActivity)); 在onActivityResult()中,通过
`
可以拿到uri,但获得的图片是被压缩过的。若指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);输出路径,则此处的intent为null,但可以使用我们存的uri读取照片,此时的照片没有被压缩。
2.从相册中读取照片, 方法:
`
`
即使设置 intent.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri(srcActivity));输出路径,仍然不能从此路径中读取,只能在onActivityForResult()中通过event.uri = intent.getData();方式获得图片uri。
此种现象也好理解,拍照时产生新的图片,自然可根据设置的uri进行图片保存,而读取相册时,图片已经在目录中不能转移到自己设定的uri中。
Androidmanifest.xml中
`
在 res/xml/provider_paths.xml
`
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="JDTobs" path=""/>
<files-path name="name" path="path" />
<cache-path name="name" path="path" /> <external-path name="name" path="path" />
<external-files-path name="name" path="path" />
<external-cache-path name="name" path="path" /> </paths> `
读取uri
『叁』 一个关于android的问题,我通过下面的方法调用相机,可是怎么可以在拍照结束后获取照片的路径呢
Android调用系统拍照的代码:
创建Intent Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String imagePath = Environment.getExternalStorageDirectory() + "/image" ;
设置文件路径 File file = new File(imagePath);
if(!file.exists()){
file.mkdirs(); }
设置URI,指定相册拍照后保存图片的路径,Uri imageUri = Uri.fromFile(new File(imagePath, "image.jsp"));
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(openCameraIntent, REQUEST_CODE_TAKING_PICTURES);
拍照完以后,文件就会保存在这个指定的目录下了。Uri 里指定了相机拍照的路径。
『肆』 android 调用系统照相机拍照后获得图片路径
{privateUrimOutPutFileUri;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ButtontakePiCButton=(Button)this.findViewById(R.id.button1);
takePiCButton.setOnClickListener(this);
}
@Override
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.button1:
saveFullImage();
break;
default:
break;
}
}
privatevoidsaveFullImage(){
Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
//文件夹aaaa
Stringpath=Environment.getExternalStorageDirectory().toString()+"/aaaa";
Filepath1=newFile(path);
if(!path1.exists()){
path1.mkdirs();
}
Filefile=newFile(path1,System.currentTimeMillis()+".jpg");
mOutPutFileUri=Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT,mOutPutFileUri);
startActivityForResult(intent,1);
}
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
super.onActivityResult(requestCode,resultCode,data);
if(requestCode==1){
UriimageUri=null;
if(data!=null){
if(data.hasExtra("data")){
Bitmapthunbnail=data.getParcelableExtra("data");
//处理缩略图
}
}else{
//处理mOutPutFileUri中的完整图像
}
}
}
}
『伍』 Android 寮鍙戣皟鐢ㄧ浉鏈烘媿鐓у備綍鑾峰彇娓呮櫚鐓х墖
@Override
public boolean onTouchEvent(MotionEvent event) {
// 瑙︽懜灞忓箷鑷鍔ㄥ圭劍
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mCamera.autoFocus(new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
}
});
}
return super.onTouchEvent(event);
}//杩欎釜鏄痑ctivity鐨勫熀鏈浜嬩欢锛屽湪杩欎釜浜嬩欢涓鍐欏叆锛屽圭劍灏卞ソ浜嗐備富瑕佹槸瀵圭劍鎿嶄綔
『陆』 android开发怎么实现拍照上传
最近看了几篇关于Android照相机的一些文章,现在总结如下,直接上源代码把,该说的都用注释说完了
1.java代码
package org.android.test;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
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.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class Android_mytestActivity extends Activity {
/** Called when the activity is first created. */
// 定义一个button打开照相机,定义一个imageview显示照相机所拍摄的相片;
Button but,upload_image;
ImageView img;
// 获取sd卡根目录地址,并创建图片父目录文件对象和文件的对象;
String file_str = Environment.getExternalStorageDirectory().getPath();
File mars_file = new File(file_str + "/my_camera");
File file_go = new File(file_str + "/my_camera/file.jpg");
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
but = (Button) findViewById(R.id.my_camare_button);
upload_image=(Button)findViewById(R.id.upload_image);
img = (ImageView) findViewById(R.id.my_img_view);
//拍照
but.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 验证sd卡是否正确安装:
if (Environment.MEDIA_MOUNTED.equals(Environment
.getExternalStorageState())) {
// 先创建父目录,如果新创建一个文件的时候,父目录没有存在,那么必须先创建父目录,再新建文件。
if (!mars_file.exists()) {
mars_file.mkdirs();
}
/*//常规情况下,我们这里会 创建子目录,但在这里不用系统拍照完毕后会根据所给的图片路径自动去实现;
if(!file_go.exists())
{
try {
file_go.createNewFile();
} catch (IOException e) {
}}
*/
// 设置跳转的系统拍照的activity为:MediaStore.ACTION_IMAGE_CAPTURE ;
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 并设置拍照的存在方式为外部存储和存储的路径;
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(file_go));
//跳转到拍照界面;
startActivityForResult(intent, 0x1);
} else {
Toast.makeText(Android_mytestActivity.this, "请先安装好sd卡",
Toast.LENGTH_LONG).show();
}
}
});
//上传
upload_image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(file_go.exists())
{
//验证图片存在后就实现,上传功能,得到与服务器的输出流...
//什么URLconnection ,HttpURLconnectio等都可以.......
Toast.makeText(Android_mytestActivity.this, "上传中....",
Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(Android_mytestActivity.this, "请先拍照....",
Toast.LENGTH_LONG).show();
}
}
});
}
//拍照结束后显示图片;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
// 判断请求码和结果码是否正确,如果正确的话就在activity上显示刚刚所拍照的图片;
if (requestCode == 0x1 && resultCode == this.RESULT_OK) {
/* 使用BitmapFactory.Options类防止OOM(Out Of Memory)的问题;
创建一个BitmapFactory.Options类用来处理bitmap;*/
BitmapFactory.Options myoptions=new BitmapFactory.Options();
/* 设置Options对象inJustDecodeBounds的属性为true,用于在BitmapFactory的
decodeFile(String path, Options opt)后获取图片的高和宽;
而且设置了他的属性值为true后使用BitmapFactory的decodeFile()方法无法返回一张
图片的bitmap对象,仅仅是把图片的高和宽信息给Options对象;
*/
myoptions.inJustDecodeBounds=true;
BitmapFactory.decodeFile(file_go.getAbsolutePath(),myoptions);
//根据在图片的宽和高,得到图片在不变形的情况指定大小下的缩略图,设置宽为222;
int height=myoptions.outHeight*222/myoptions.outWidth;
myoptions.outWidth=222;
myoptions.outHeight=height;
//在重新设置玩图片显示的高和宽后记住要修改,Options对象inJustDecodeBounds的属性为false;
//不然无法显示图片;
myoptions.inJustDecodeBounds=false;
//还没完这里才刚开始,要节约内存还需要几个属性,下面是最关键的一个;
myoptions.inSampleSize=myoptions.outWidth/222;
//还可以设置其他几个属性用于缩小内存;
myoptions.inPurgeable=true;
myoptions.inInputShareable=true;
myoptions.inPreferredConfig=Bitmap.Config.ARGB_4444;// 默认是Bitmap.Config.ARGB_8888
//成功了,下面就显示图片咯;
Bitmap bitmat = BitmapFactory.decodeFile(file_go.getAbsolutePath(),myoptions);
img.setImageBitmap(bitmat);
} else {
System.out.println("不显示图片");
}
super.onActivityResult(requestCode, resultCode, data);
}
}
转载