zoukankan      html  css  js  c++  java
  • Android调用相机并将照片存储到SD卡上实现方法

    【转载】

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

    读写sd卡文件必须首先要在Mainifest.xml文件中配置权限:

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

    用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(); 

     private String getPhotoFileName() {
            Date date = new Date(System.currentTimeMillis());
            SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss");         
            return dateFormat.format(date) + ".jpg";
        }

    完整代码如下:

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

    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> 
     
  • 相关阅读:
    高质量图形库:pixellib
    有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取
    Freebie: Material Design UI Kit
    Git 10 周年之际,创始人 Linus Torvalds 访谈
    React.js 样式组件:React Style
    有趣 GIF 动图集
    10个免费开源的JS音乐播放器插件
    简约的单页应用引擎:sonnyJS
    2015年4月 非常干货之Python资源大全
    评论 ”[实例] 设计基于JQM的WebApp“
  • 原文地址:https://www.cnblogs.com/masonchi/p/3445922.html
Copyright © 2011-2022 走看看