-
android调用系统相机
2015-05-26 18:47:39首先先说明一下,鉴于网上搜android调用系统相机,得到的内容一大把都是:调用系统相机然后获得图片(网上一大把这样的东西,抄过来抄过去,有些人根本就不加以验证是否有效,很不提倡这种做法),如果需要这样功能...首先先说明一下,鉴于网上搜android调用系统相机,得到的内容一大把都是:调用系统相机然后获得图片(网上一大把这样的东西,抄过来抄过去,有些人根本就不加以验证是否有效,很不提倡这种做法),如果需要这样功能的请自行百度,我待会介绍的是单纯调用系统相机,但不需要获取图片。
就单纯调用系统相机而言,先说说几个问题
1、系统版本
这个问题在这个帖子中说明了
http://www.eoeandroid.com/thread-536075-1-1.html
在不同版本的系统中,调用的方法似乎不一样,上述的方法在我的小米2S手机上试了不行
2、大部分机型可以,其他机型目前只测试了小米和三星。
3、机型
我在我手机上常使用的方法是
ComponentName comp = new ComponentName("com.android.camera", "com.android.camera.Camera"); intent.setComponent(comp); intent.setAction("android.intent.action.VIEW"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); startActivity(intent);
这个方法确实可行,但是当我在nexus 5上使用时,程序崩溃了........无意间得到这个帖子的一点启示
http://www.apkbus.com/android-182775-1-1.html
可以先通过找到包名再调用相机,因为我发现,之前小米可用的那个方法虽然在别的机型上不行,但是如果Intent的Action是MediaStore.ACTION_IMAGE_CAPTURE。虽然网上很多说“调用系统相机拍照返回照片”用的都是这个,但是确实在很多机型上都可以打开相机
于是我想到了,既然相机包名找到了,那可以通过包名启动相机
Intent infoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); ResolveInfo res = getPackageManager(). resolveActivity(infoIntent, 0); if (res != null) { //启动相机 startApplicationByPackageName(res.activityInfo.packageName); }
其中startApplicationByPackageName方法如下//通过包名启动应用 private void startApplicationByPackageName(String packName) { PackageInfo packageInfo=null; try{ packageInfo=getPackageManager().getPackageInfo(packName, 0); }catch(Exception e){ e.printStackTrace(); } if(null==packageInfo){ return; } Intent resolveIntent=new Intent(); resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); resolveIntent.setPackage(packageInfo.packageName); List<ResolveInfo> resolveInfoList =getPackageManager().queryIntentActivities(resolveIntent, 0); if(null==resolveInfoList){ return; } Iterator<ResolveInfo> iter=resolveInfoList.iterator(); while(iter.hasNext()){ ResolveInfo resolveInfo=(ResolveInfo) iter.next(); if(null==resolveInfo){ return; } String packageName=resolveInfo.activityInfo.packageName; String className=resolveInfo.activityInfo.name; Intent intent=new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ComponentName cn=new ComponentName(packageName, className); intent.setComponent(cn); startActivity(intent); }//while }//method
考虑到三星的部分机型不吃MediaStore.ACTION_IMAGE_CAPTURE这套,但是却吃MediaStore.ACTION_IMAGE_CAPTURE_SECURE,前后只是多了一个SECURE。因此稍作修改,完整方法如下(目前我手上的机型都支持,包括Vivo、魅族、三星、锤子、小米、Nexus、索尼、HTC)//启动相机 private void launchCamera() { try{ //获取相机包名 Intent infoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); ResolveInfo res = mContext.getPackageManager(). resolveActivity(infoIntent, 0); if (res != null) { String packageName=res.activityInfo.packageName; if(packageName.equals("android")) { infoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE_SECURE); res = mContext.getPackageManager(). resolveActivity(infoIntent, 0); if (res != null) packageName=res.activityInfo.packageName; } //启动相机 startApplicationByPackageName(packageName); } } catch(Exception e) { e.printStackTrace(); } } //通过包名启动应用 private void startApplicationByPackageName(String packName) { PackageInfo packageInfo=null; try{ packageInfo=mContext.getPackageManager().getPackageInfo(packName, 0); }catch(Exception e){ e.printStackTrace(); } if(null==packageInfo){ return; } Intent resolveIntent=new Intent(); resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); resolveIntent.setPackage(packageInfo.packageName); List<ResolveInfo> resolveInfoList =mContext.getPackageManager().queryIntentActivities(resolveIntent, 0); if(null==resolveInfoList){ return; } Iterator<ResolveInfo> iter=resolveInfoList.iterator(); while(iter.hasNext()){ ResolveInfo resolveInfo=(ResolveInfo) iter.next(); if(null==resolveInfo){ return; } String packageName=resolveInfo.activityInfo.packageName; String className=resolveInfo.activityInfo.name; Intent intent=new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ComponentName cn=new ComponentName(packageName, className); intent.setComponent(cn); mContext.startActivity(intent); }//while }//method
-
Android 调用系统相机
2016-09-07 16:25:12Android 调用系统相机拍照、以及相册。完成之后图片是上传到app上。前面的功能已经测试过了。没有上传到服务器,因为我没服务器测试。但项目里面有个类可以参考上传图片到服务器,我就没测试了。接下来看代码,虽然...Android 调用系统相机拍照、以及相册。完成之后图片是上传到app上。前面的功能已经测试过了。没有上传到服务器,因为我没服务器测试。但项目里面有个类可以参考上传图片到服务器,我就没测试了。接下来看代码,虽然注释写得少,但其作用看英文单词意思,又在或是查看调用。
项目源码下载地址:http://download.csdn.net/detail/qq_16064871/8585169转载请注明出处: http://blog.csdn.net/qq_16064871
activity_main.xml
layout_login_choose_photo.xmlNetUtil这个类,我也是参考网上的,没测试过。是图片上传服务器的。
记得加入权限,权限主要是访问sd存储,以及调用系统相机,相册。上传服务器权限也有了。只是我没服务器测试。
项目源码下载地址:http://download.csdn.net/detail/qq_16064871/8585169转载请注明出处: http://blog.csdn.net/qq_16064871
-
Android调用系统相机
2017-06-27 23:24:03所以接下来我们会学习一下调用系统相机拍摄照片的简单使用。 调用系统相机并返回数据的方式有两种:1)指定图片保存的路径;2)使用默认的图片保存路径; 下面是两种方式效果截图: 图1 指定图片保存...1.概述
在大多数应用开发中,我们并不需要自己去写一个自定义的相机拍摄和预览功能,这个时候我们只需要调用系统的摄像头接收它拍摄后为我们返回的数据即可。所以接下来我们会学习一下调用系统相机拍摄照片的简单使用。调用系统相机并返回数据的方式有两种:1)指定图片保存的路径;2)使用默认的图片保存路径; 下面是两种方式效果截图:图1 指定图片保存的路径效果 图2 使用默认的图片保存路径效果明显两种方式返回的图片不一样大小,图2 图片很小的原因是系统在照片返回的时候对它进行了压缩。好了接下来是我们调用系统相机的实现步骤。2.实现2.1 manifest文件注册权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permisssion.CAMERA"/>
2.2 activity_main.xml布局文件:<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.elimy.camera.MainActivity">
<ImageView
android:src="@mipmap/ic_launcher"
android:id="@+id/pic"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/startCamera"
android:text="调用系统相机"
android:layout_below="@id/pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
2.3 MainActivity.java布局类文件:package com.example.elimy.camera;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_TAKE_PHOTO_CODE=1;
public static final int REQUST_TAKE_PHOTTO_CODE2=2;
private ImageView imageView;
Button startbtn;
// /storage/emulated/0/pic
public final static String SAVED_IMAGE_PATH1=Environment.getExternalStorageDirectory().getAbsolutePath()+"/pic";//+"/pic";
// /storage/emulated/0/Pictures
public final static String SAVED_IMAGE_PATH=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();//.getAbsolutePath()+"/pic";//+"/pic";
String photoPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("SAVED_IMAGE_PATH1",SAVED_IMAGE_PATH1);
Log.d("SAVED_IMAGE_PATH",SAVED_IMAGE_PATH);
//布局初始化绑定
imageView = (ImageView) findViewById(R.id.pic);
startbtn = (Button) findViewById(R.id.startCamera);
//调用按钮监听
startbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取SD卡安装状态
String state= Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)){
//设置图片保存路径
photoPath=SAVED_IMAGE_PATH+"/"+System.currentTimeMillis()+".png";
File imageDir=new File(photoPath);
if(!imageDir.exists()){
try {
//根据一个 文件地址生成一个新的文件用来存照片
imageDir.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
takePhotoByMethod1();
//takePhotoByMethod2();
}else {
Toast.makeText(MainActivity.this,"SD卡未插入",Toast.LENGTH_SHORT).show();
}
}
});
}
/*
* 接收调用相机后返回的数据
* */
@Override
public void onActivityResult(int requestCode,int resultCode,Intent data){
if (requestCode==REQUEST_TAKE_PHOTO_CODE&&resultCode==Activity.RESULT_OK){
File photoFile=new File(photoPath);
if (photoFile.exists()){
//通过图片地址将图片加载到bitmap里面
Bitmap bm= BitmapFactory.decodeFile(photoFile.getAbsolutePath());
//将拍摄的照片显示到界面上
imageView.setVisibility(View.VISIBLE);
imageView.setImageBitmap(bm);
}else {
Toast.makeText(MainActivity.this,"图片文件不存在",Toast.LENGTH_LONG).show();
}
}else if (requestCode==REQUST_TAKE_PHOTTO_CODE2&&resultCode==Activity.RESULT_OK){
Bundle bundle=data.getExtras();
if (bundle!=null){
Bitmap bm= (Bitmap) bundle.get("data");
if (bm!=null){
imageView.setVisibility(View.VISIBLE);
imageView.setImageBitmap(bm);
}
}else {
Toast.makeText(MainActivity.this,"没有压缩的图片数据",Toast.LENGTH_LONG).show();
}
}
}
/*
* 第一种方式调用系统摄像头拍照
* */
private void takePhotoByMethod1(){
//实例化intent,指向摄像头
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//根据路径实例化图片文件
File photoFile=new File(photoPath);
//设置拍照后图片保存到文件中
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile));
//启动拍照activity并获取返回数据
startActivityForResult(intent,REQUEST_TAKE_PHOTO_CODE);
}
/*
* 第二种方式调用系统摄像头拍照
* */
private void takePhotoByMethod2(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent,REQUST_TAKE_PHOTTO_CODE2);
}
}
系统相机的调用还是比较简单,唯一要注意的的是第一种方法中的图片保存路径必须设置好,不然会有照片拍摄后无法点击确认返回并保存的问题。 -
Android调用系统照相机
2018-02-11 12:33:34调用系统相机和相册上传图片的流程:1.点击一个按钮触发调用操作。case R.id.photograph: // 拍照 photograph.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { ...调用系统相机和相册上传图片的流程:
1.点击一个按钮触发调用操作。
case R.id.photograph:
// 拍照
photograph.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");//调用系统照相机的代码
// 2判断存储卡是否可以用,可用进行存储
String tempFileName = "";
if(type == 1){
tempFileName = IMAGE_FRONT;
}else if(type == 2){
tempFileName = IMAGE_BACK;
}else if(type == 3){
tempFileName = IMAGE_HANDS;
}
//3从内存卡读取存储的照片,传给请求照片的页面if (hasSdcard()) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
.fromFile(new File(Environment
.getExternalStorageDirectory(),
tempFileName)));
}
startActivityForResult(intent, PHOTO_REQUEST_CAMERA);
}
});//4用onActivityResult()方法根据不同的请求码保存获得的图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) { // resultCode == RESULT_OK表示系统返回的是否成功的判断码
switch (requestCode) {
case PHOTO_REQUEST_CAMERA:
setResult(2001,data);//5用setResult方法把图片保存起来,2001为结果码,data为图片数据。
finish();//6.该方法一定要写
break;
case PHOTO_REQUEST_GALLERY:
setResult(2002,data);
finish();
break;
}
}//7返回前一个界面,根据结果码显示图片。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try {
//选择图片
if (resultCode == 2002 && data != null) {
Uri uri = data.getData();
crop(uri);//8对选择的图片进行裁剪
} else if (requestCode == PHOTO_REQUEST_CUT) { //裁剪
if (data == null)
return;
if (type == 1) {
//9把选择的图片显示到指定的控件上。XGlide.init(this).display(iv_front, outFrontUri);
//10,根据图片的Uri,获得其在文件系统中的路径
frontImagePath = getRealFilePath(ApplyAgentActivity.this, outFrontUri);
} else if (type == 2) {
XGlide.init(this).display(iv_back2, outBackUri);
backImagePath = getRealFilePath(ApplyAgentActivity.this, outBackUri);
} else if (type == 3) {
XGlide.init(this).display(iv_img, outHandUri);
handleImagePath = getRealFilePath(ApplyAgentActivity.this, outHandUri);
}
} else if(resultCode == 2001){ //拍照
File tempFile = null;
if (hasSdcard()) {
if (type == 1) {
tempFile = new File(
Environment.getExternalStorageDirectory(),//访问sd卡APP专属文件中照片
IMAGE_FRONT);
} else if (type == 2) {
tempFile = new File(
Environment.getExternalStorageDirectory(),
IMAGE_BACK);
} else if (type == 3) {
tempFile = new File(
Environment.getExternalStorageDirectory(),
IMAGE_HANDS);
}
crop(Uri.fromFile(tempFile));
} else {
showTips("未找到存储卡,无法存储照片!", null);
}
}
} catch (Exception e) {
}
}根据图片的Uri,获得其在文件系统中的路径的方法
public String getRealFilePath(final Context context, final Uri uri) {
if (null == uri)
return null;
final String scheme = uri.getScheme();
String data = null;
if (scheme == null)
data = uri.getPath();
else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
data = uri.getPath();
} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
Cursor cursor = context.getContentResolver().query(uri,
new String[]{MediaStore.Images.ImageColumns.DATA}, null, null, null);
if (null != cursor) {
if (cursor.moveToFirst()) {
int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
if (index > -1) {
data = cursor.getString(index);
}
}
cursor.close();
}
}
return data;
}图片自由裁剪
/**
* 裁剪图片
*/
private void crop(Uri uri) {
outFile = new File(sd, "tsxn" + SystemClock.currentThreadTimeMillis()
+ ".png");
if (type == 1) {
outFrontUri = Uri.fromFile(outFile);
outUri = outFrontUri;
} else if (type == 2) {
outBackUri = Uri.fromFile(outFile);
outUri = outBackUri;
} else if (type == 3) {
outHandUri = Uri.fromFile(outFile);
outUri = outHandUri;
}
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1); X方向上的比例
intent.putExtra("aspectY", 1); Y方向上的比例
// 裁剪后输出图片的尺寸大小
intent.putExtra("outputX", 480); 裁剪区的宽
intent.putExtra("outputY", 480); 裁剪区的高
intent.putExtra(MediaStore.EXTRA_OUTPUT, outUri);// 将URI指向相应的file
// 图片格式
intent.putExtra("outputFormat", "png");
intent.putExtra("noFaceDetection", true);// 取消人脸识别
intent.putExtra("return-data", true);// 是否将数据保留在Bitmap中返回 startActivityForResult(intent, PHOTO_REQUEST_CUT);
}从内存卡中读取照片的步骤
一、在mainfest中获取读取SD卡的权限
<!--在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 从SDCard读取数据权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
二、找到SD卡的目录
/**
* Environment.getExternalStorageDirectory()得到:“、mnt/sdcard” 即找到了sd卡的根目录
*/
private String path=Environment.getExternalStorageDirectory()+"client/tile/1.jpg";
三、根据路径获取图片
File mFile=new File(path);
//若该文件存在
if (mFile.exists()) {
Bitmap bitmap=BitmapFactory.decodeFile(path);
return bitmap;
}
注意:
在读取sd卡中图片的过程中的一些可用判断
1、
/***有些时候我们的手机没有安装SD卡
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { String path=Environment.getExternalStorageDirectory().getPath();
}
2、获取SD卡权限成功
private String path=Environment.getExternalStorageDirectory()+"client";
File file=new File(path);
if (file.canRead()) {
Log.v("TAG", "可读");
}
if (file.canWrite()) {
Log.v("TAG", "可写");
}
是时候弄清楚getExternalStorageDirectory()和getExternalFilesDir()的区别了
app专属文件:就是那些只有该app才可以使用的文件,例如专属格式的电子书,这类文件当我们删除应用之后,还应该保留在手机上的,例如拍照的照片,不应该随着删除应用而被删除掉。对于这类文件,Android给我们提供了特定的目录,这些目录都是以DIRECTORY开头的,例如:DIRECTORY_MUSIC , DIRECTORY_PICTURES.
访问APP专属文件夹有两种方式:
File sdCard = Environment.getExternalStorageDirectory();
File directory_pictures = new File(sdCard, "Pictures");
File directory_pictures = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
app独立文件就是那些不依赖于某特定app的文件,例如照片。这类文件应该是随着app删除而一起删除的,它们可以被存储在两个地方:internal storage 和 external storage 。 internal storage就是手机自带的一块存储区域,通常很小;external storage就是通常所说的SD卡,通常很大,有16GB,32GB等。internal storage很小,所以你就应该很正确的使用它,因为SD卡有可能会被用户卸下,换成新的,所以SD卡不是任何时间都可用的,因此我们必须将一些重要的数据库文件以及一些用户配置文件存放在internal storage中。将一些大的图片或文件等缓存放到external storage中。这是你app私有的目录,你的shared preference文件,数据库文件,都存储在这里。目录为data/data/< package name >/files/
访问方法为:File filesDir = getFilesDir();
File externalFilesDir = getExternalFilesDir(null);
添加权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
File externalFilesDir = getExternalFilesDir("Caches");
MediaStore这个类是android系统提供的一个多媒体数据库,android中多媒体信息都可以从这里提取。这个MediaStore包括了多媒体数据库的所有信息,包括音频,视频和图像,android把所有的多媒体数据库接口进行了封装,所有的数据库不用自己进行创建,直接调用利用ContentResolver去掉用那些封装好的接口就可以进行数据库的操作了。
-
android 调用系统相机
2016-05-27 07:17:00// 调用相机拍照的请求码 public static final int REQUEST_TAKE_PHOTO_CODE = 1; public static final int REQUEST_TAKE_PHOTO_CODE2 = 2; // 拍照后显示图片的ImageView private void startTakePhoto2()... -
Android调用系统照相机并保存
2016-09-09 17:13:12Android调用系统照相机并保存 -
Android 调用系统照相机拍照和录像
2020-09-01 16:37:07本文主要介绍Android 调用系统照相机拍照和录像的资料,这里整理了详细的代码,有需要的小伙伴可以参考下 -
android 调用系统照相机
2014-07-18 13:47:48[java] view plaincopyprint? package com.b509.activity.patient; import java.io.File; import java.io.FileNotFoundException; import java.io....import java.io -
Android调用系统照相机
2012-08-12 19:36:341)起Intent captrueIntent=new Intent(android.provider.mediastore.ACTION_IMAGE_CAPTURE); 2)context.startActivityForResult(captrueIntent,0);-->当系统拍照完毕后会有回调onActivityResult出现 3)在... -
Android 调用系统相机拍照
2018-10-29 11:48:37Android 调用系统相机拍照攻略(已适配Android N)