频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
我的Android笔记(五)——调用相机并将照片存储到sd卡上
2012-03-17 11:12:49           
收藏   我要投稿

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

用Intent启动相机的代码:

[java]
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, 1); 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent, 1);
拍完照后就可以在onActivityResult(int requestCode, int resultCode, Intent data)中获取到Bitmap对象了。

[java]
Bitmap bitmap = (Bitmap) data.getExtras().get("data"); 
   Bitmap bitmap = (Bitmap) data.getExtras().get("data");


要将图像存储到sd卡之前最好先检查一下sd卡是否可用


[java]
String sdStatus = Environment.getExternalStorageState(); 
        if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用  
            Log.v("TestFile", 
                    "SD card is not avaiable/writeable right now."); 
            return; 
        } 
 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”


[java]
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(); 
    } 

   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文件中配置权限:


[html]
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

-----------------------------------------------------------------------------------------------------

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

完整代码如下:

MyCaremaActivity.java

 

[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里  
        } 
    } 

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[html]
<?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> 
<?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


[html]
<?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> 
<?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>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------

代码下载:http://up.2cto.com/2012/0317/20120317111515444.zip
 

小米手机亲测可用。

 摘自  摘自  狼的第二个小窝
 

点击复制链接 与好友分享!回本站首页
上一篇:我的Android笔记(四)—— SQLite设置_id自增的方法
下一篇:我的Android笔记(六)——分享一个自己的NumberPicker
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站