Android——Carema的使用

来源:互联网 发布:002065东华软件 编辑:程序博客网 时间:2024/05/22 03:36

相机可以自己编写,也可以调用系统的相机,此处我们是调用系统相机

使用camera要先加权限

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

实例

布局文件

<LinearLayout 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:orientation="vertical" tools:context=".MainActivity"><Button    android:id="@+id/btn_camera"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="调用系统相机"/>    <ImageView        android:id="@+id/imageview"        android:layout_width="match_parent"        android:layout_height="match_parent"        /></LinearLayout>

GetPathFromUri4kitkat ,4.4以上版本通过Uri获得文件路径的方法

package com.example.administrator.mycamera;import android.annotation.SuppressLint;import android.content.ContentUris;import android.content.Context;import android.database.Cursor;import android.net.Uri;import android.os.Build;import android.os.Environment;import android.provider.DocumentsContract;import android.provider.MediaStore;/** * Created by Administrator on 2015/9/16. */public class GetPathFromUri4kitkat {    /**     * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使     * 若为4.4以下版本此方法忽略     */    @SuppressLint("NewApi")    public static String getPath(final Context context, final Uri uri) {        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;        // DocumentProvider        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {            // ExternalStorageProvider            if (isExternalStorageDocument(uri)) {                final String docId = DocumentsContract.getDocumentId(uri);                final String[] split = docId.split(":");                final String type = split[0];                if ("primary".equalsIgnoreCase(type)) {                    return Environment.getExternalStorageDirectory() + "/" + split[1];                }                // TODO handle non-primary volumes            }            // DownloadsProvider            else if (isDownloadsDocument(uri)) {                final String id = DocumentsContract.getDocumentId(uri);                final Uri contentUri = ContentUris.withAppendedId(                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));                return getDataColumn(context, contentUri, null, null);            }            // MediaProvider            else if (isMediaDocument(uri)) {                final String docId = DocumentsContract.getDocumentId(uri);                final String[] split = docId.split(":");                final String type = split[0];                Uri contentUri = null;                if ("image".equals(type)) {                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;                } else if ("video".equals(type)) {                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;                } else if ("audio".equals(type)) {                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;                }                final String selection = "_id=?";                final String[] selectionArgs = new String[] { split[1] };                return getDataColumn(context, contentUri, selection, selectionArgs);            }        }        // MediaStore (and general)        else if ("content".equalsIgnoreCase(uri.getScheme())) {            return getDataColumn(context, uri, null, null);        }        // File        else if ("file".equalsIgnoreCase(uri.getScheme())) {            return uri.getPath();        }        return null;    }    /**     * Get the value of the data column for this Uri. This is useful for     * MediaStore Uris, and other file-based ContentProviders.     *     * @param context     *            The context.     * @param uri     *            The Uri to query.     * @param selection     *            (Optional) Filter used in the query.     * @param selectionArgs     *            (Optional) Selection arguments used in the query.     * @return The value of the _data column, which is typically a file path.     */    public static String getDataColumn(Context context, Uri uri, String selection,                                       String[] selectionArgs) {        Cursor cursor = null;        final String column = "_data";        final String[] projection = { column };        try {            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,                    null);            if (cursor != null && cursor.moveToFirst()) {                final int column_index = cursor.getColumnIndexOrThrow(column);                return cursor.getString(column_index);            }        } finally {            if (cursor != null)                cursor.close();        }        return null;    }    /**     * @param uri     *            The Uri to check.     * @return Whether the Uri authority is ExternalStorageProvider.     */    public static boolean isExternalStorageDocument(Uri uri) {        return "com.android.externalstorage.documents".equals(uri.getAuthority());    }    /**     * @param uri     *            The Uri to check.     * @return Whether the Uri authority is DownloadsProvider.     */    public static boolean isDownloadsDocument(Uri uri) {        return "com.android.providers.downloads.documents".equals(uri.getAuthority());    }    /**     * @param uri     *            The Uri to check.     * @return Whether the Uri authority is MediaProvider.     */    public static boolean isMediaDocument(Uri uri) {        return "com.android.providers.media.documents".equals(uri.getAuthority());    }}

MainActivity

package com.example.administrator.mycamera;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.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Button;import android.widget.ImageView;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.net.URL;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private Button mBtnCamera;    private ImageView imageView;    private File file;    private Button mBtnGetGallery;    private static final int GET_GALLERY=0x24;    private static final int TAKE_PICTURE=0x23;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mBtnCamera= (Button) findViewById(R.id.btn_camera);        imageView= (ImageView) findViewById(R.id.imageview);        mBtnCamera.setOnClickListener(this);        mBtnGetGallery= (Button) findViewById(R.id.btn_get_gallery);        mBtnGetGallery.setOnClickListener(this);    }    @Override    public void onClick(View v) {       switch (v.getId()){           case R.id.btn_camera:               Intent intent=new Intent();               //隐式启动系统相机               intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);               //创建照片的存储位置及文件名               file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");               try {                   file.createNewFile();               } catch (IOException e) {                   e.printStackTrace();               }               //告诉相机保存照片的位置               intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));               //开始启动               startActivityForResult(intent,TAKE_PICTURE);               break;           case R.id.btn_get_gallery:               Intent intentFromGallery = new Intent();               intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);               intentFromGallery.setType("image/*");               startActivityForResult(intentFromGallery,GET_GALLERY);               break;       }    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);            if(resultCode==RESULT_OK){                //得到图片                switch (requestCode){                    case TAKE_PICTURE:                        //某些手机不能显示大图片,故此处调用将图片压缩的方法                        zipImage(file.getAbsolutePath());                        imageView.setImageURI(Uri.fromFile(file));                        break;                    case GET_GALLERY:                        Uri uri=data.getData();                        //调用获得4.4版本以上由Uri获得文件路径的方法                        File file1=new File(GetPathFromUri4kitkat.getPath(MainActivity.this,uri)) ;                        //调用压缩图片的方法对文件进行压缩                        zipImage(file1.getAbsolutePath());                        //将图片设置到imageView上                        imageView.setImageURI(Uri.fromFile(file1));//                        imageView.setImageURI(uri);                        break;            }}    }    /**     * 压缩图片的方法     * @param savePath     */    private void zipImage(String savePath) {        BitmapFactory.Options options = new BitmapFactory.Options();        options.inJustDecodeBounds = true;        BitmapFactory.decodeFile(savePath, options);        options.inSampleSize = computeInitialSampleSize(options, 480, 480 * 960);        options.inJustDecodeBounds = false;        Bitmap bitmap = BitmapFactory.decodeFile(savePath, options);        try {            FileOutputStream fos = new FileOutputStream(savePath);            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);            fos.flush();            fos.close();        } catch (IOException e) {            e.printStackTrace();        }        bitmap.recycle();        bitmap = null;        System.gc();    }    public int computeSampleSize(BitmapFactory.Options options,                                 int minSideLength, int maxNumOfPixels) {        int initialSize = computeInitialSampleSize(options, minSideLength,                maxNumOfPixels);        int roundedSize;        if (initialSize <= 8) {            roundedSize = 1;            while (roundedSize < initialSize) {                roundedSize <<= 1;            }        } else {            roundedSize = (initialSize + 7) / 8 * 8;        }        return roundedSize;    }    private int computeInitialSampleSize(BitmapFactory.Options options,                                         int minSideLength, int maxNumOfPixels) {        double w = options.outWidth;        double h = options.outHeight;        int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math                .sqrt(w * h / maxNumOfPixels));        int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(                Math.floor(w / minSideLength), Math.floor(h / minSideLength));        if (upperBound < lowerBound) {            // return the larger one when there is no overlapping zone.            return lowerBound;        }        if ((maxNumOfPixels == -1) && (minSideLength == -1)) {            return 1;        } else if (minSideLength == -1) {            return lowerBound;        } else {            return upperBound;        }    }}
0 0