博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android调用相机并将照片存储到sd卡上
阅读量:7155 次
发布时间:2019-06-29

本文共 4567 字,大约阅读时间需要 15 分钟。

Android中实现拍照有两种方法,一种是调用系统自带的相机,然后使用其返回的照片数据。 还有一种是自己用Camera类和其他相关类实现相机功能,这种方法定制度比较高,洗染也比较复杂,一般平常的应用只需使用第一种即可。

用Intent启动相机的代码:

Intent intent = 
new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
拍完照后就可以在onActivityResult(int requestCode, int resultCode, Intent data)中获取到Bitmap对象了。
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
要将图像存储到sd卡之前最好先检查一下sd卡是否可用
    String sdStatus = Environment.getExternalStorageState();
            
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { 
//
 检测sd是否可用
                Log.v("TestFile",
                        "SD card is not avaiable/writeable right now.");
                
return;
            }
以下代码可以实现将图像文件存到“sdcard/myImage/”文件夹下,名称为“111.jpg”
            File file = 
new File("/sdcard/myImage/");
            file.mkdirs();
//
 创建文件夹
            String fileName = "/sdcard/myImage/111.jpg";
            
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();
                }
            }
另外要注意的是读写sd卡文件必须首先要在Mainifest.xml文件中配置权限:
    
<
uses-permission 
android:name
="android.permission.WRITE_EXTERNAL_STORAGE"
 
/>
    
<
uses-permission 
android:name
="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
 
/>

一个demo,实现调用系统相机拍照,将其显示在屏幕上,并且存到sd卡。

完整代码如下:

MyCaremaActivity.java

package barry.android.c;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public 
class MyCaremaActivity 
extends Activity {
    @Override
    
public 
void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(
new OnClickListener() {
            @Override
            
public 
void onClick(View v) {
                Intent intent = 
new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, 1);
            }
        });
    }
    @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.v("TestFile",
                        "SD card is not avaiable/writeable right now.");
                
return;
            }
            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/111.jpg";
            
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.imageView)).setImageBitmap(bitmap);
//
 将图片显示在ImageView里
        }
    }
}

 

main.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
LinearLayout 
xmlns:android
="http://schemas.android.com/apk/res/android"
    android:layout_width
="fill_parent"
    android:layout_height
="fill_parent"
    android:orientation
="vertical"
 
>
    
<
Button
        
android:id
="@+id/button"
        android:layout_width
="fill_parent"
        android:layout_height
="wrap_content"
        android:text
="点击启动相机"
 
/>
    
<
ImageView
        
android:id
="@+id/imageView"
        android:layout_width
="fill_parent"
        android:layout_height
="fill_parent"
        android:background
="#999999"
 
/>
</
LinearLayout
>
AndroidMainifest.xml
<?
xml version="1.0" encoding="utf-8"
?>
<
manifest 
xmlns:android
="http://schemas.android.com/apk/res/android"
    package
="barry.android.c"
    android:versionCode
="1"
    android:versionName
="1.0"
 
>
    
<
uses-sdk 
android:minSdkVersion
="7"
 
/>
    
<
uses-permission 
android:name
="android.permission.WRITE_EXTERNAL_STORAGE"
 
/>
    
<
uses-permission 
android:name
="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
 
/>
    
<
application
        
android:icon
="@drawable/ic_launcher"
        android:label
="@string/app_name"
 
>
        
<
activity
            
android:label
="@string/app_name"
            android:name
=".MyCaremaActivity"
 
>
            
<
intent-filter 
>
                
<
action 
android:name
="android.intent.action.MAIN"
 
/>
                
<
category 
android:name
="android.intent.category.LAUNCHER"
 
/>
            
</
intent-filter
>
        
</
activity
>
    
</
application
>
</
manifest
>
小米手机亲测可用。
源码:
url:

 

转载于:https://www.cnblogs.com/greatverve/archive/2012/03/15/android-Carema.html

你可能感兴趣的文章
Hibernate实现有两种配置,xml配置与注释配置
查看>>
学以致用十三-----Centos7.2+python3+YouCompleteMe成功历程
查看>>
Crossbuild: with crosstool-ng
查看>>
【个人作业】单词统计
查看>>
C# 绘制矩形(绘制正方形)
查看>>
矿产资源储量动态监管服务
查看>>
TSM 文件备份到 disk
查看>>
php的一些小细节
查看>>
你真的理解了JavaScript的逻辑操作符吗?
查看>>
go语言与所谓的包
查看>>
redis/memcache监控管理工具——treeNMS
查看>>
javascript语言来源
查看>>
python例子三
查看>>
学习第十二
查看>>
数据库_SQL语句
查看>>
RecyclerView 下拉刷新和加载更多
查看>>
Java线程池相关类-Executor框架
查看>>
插入排序Java版
查看>>
C#分页插件 Webdiyer
查看>>
如何减少回流,重绘
查看>>