Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 拍照或從相冊取圖片並裁剪

Android 拍照或從相冊取圖片並裁剪

編輯:關於Android編程

android拍照或從相冊取圖片並裁剪,這個功能很常用,網上也有不少例子,可是很多之前的代碼已經都不好用了。這個可能與4.4之後,相冊返回的地址和原來不一樣有關系吧,下面是我的代碼,在nexus6中測試通過。   

  activity_album.xml布局文件  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.cg.cameralearn.AlbumActivity"
    tools:showIn="@layout/activity_album"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/img_album"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"/>

</LinearLayout>

  menu_album.xml菜單布局
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_openCameral"
        android:title="打開相機"
        app:showAsAction="never" />
    <item
        android:id="@+id/menu_openAlbum"
        android:title="打開相冊"
        app:showAsAction="never" />
</menu>

AlbumActivity.java

package com.example.cg.cameralearn;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;

import java.io.File;

public class AlbumActivity extends AppCompatActivity {

    public static void AlbumActivityStart(Context context)
    {
        Intent intent = new Intent();
        intent.setClass(context, AlbumActivity.class);
        context.startActivity(intent);
    }

    private ImageView img_album;
    // 拍照成功,讀取相冊成功,裁減成功
    private final int  ALBUM_OK = 1, CAMERA_OK = 2,CUT_OK = 3;
    private File file;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_album);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        // 定義拍照後存放圖片的文件位置和名稱,使用完畢後可以方便刪除
        file = new File(Environment.getExternalStorageDirectory(), "temp.jpg");
        file.delete();// 清空之前的文件

        initControls();
    }

    /**
     * 初始化控件
     */
    private void initControls() {
        img_album = (ImageView)findViewById(R.id.img_album);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.menu_album, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        switch (id)
        {
            case R.id.menu_openCameral:

                //這裡被注掉的,是在6.0中進行權限判斷的,大家可以根據情況,自行加上
                /*if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {
                    //申請WRITE_EXTERNAL_STORAGE權限
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            123);
                    Log.e("Album","我沒有權限啊");
                }else {

                    Log.e("Album","我有權限啊");
                }*/

                // 來自相機
                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                // 下面這句指定調用相機拍照後的照片存儲的路徑
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
                startActivityForResult(cameraIntent, CAMERA_OK);// CAMERA_OK是用作判斷返回結果的標識
                break;
            case R.id.menu_openAlbum:
                // 來自相冊
                Intent albumIntent = new Intent(Intent.ACTION_PICK, null);
                /**
                 * 下面這句話,與其它方式寫是一樣的效果,如果:
                 * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                 * intent.setType(""image/*");設置數據類型
                 * 要限制上傳到服務器的圖片類型時可以直接寫如:"image/jpeg 、 image/png等的類型"
                 */
                albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                startActivityForResult(albumIntent, ALBUM_OK);
                break;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        System.out.println("requestCode = " + requestCode);
        switch (requestCode) {
            // 如果是直接從相冊獲取
            case ALBUM_OK:
                //從相冊中獲取到圖片了,才執行裁剪動作
                if (data != null) {
                    clipPhoto(data.getData(),ALBUM_OK);
                    //setPicToView(data);
                }
                break;
            // 如果是調用相機拍照時
            case CAMERA_OK:
                // 當拍照到照片時進行裁減,否則不執行操作
                if (file.exists()) {
                    clipPhoto(Uri.fromFile(file),CAMERA_OK);//開始裁減圖片
                }
                break;
            // 取得裁剪後的圖片,這裡將其設置到imageview中
            case CUT_OK:
                /**
                 * 非空判斷大家一定要驗證,如果不驗證的話, 在剪裁之後如果發現不滿意,
                 * 要重新裁剪,丟棄 當前功能時,會報NullException
                 */

                if (data != null) {
                    setPicToView(data);
                }else
                {
                    Log.e("Main","data為空");
                }
                break;
            default:
                break;

        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    /**
     * 裁剪圖片方法實現
     * @param uri          圖片uri
     * @param type         類別:相機,相冊
     */
    public void clipPhoto(Uri uri,int type) {


        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // 下面這個crop = true是設置在開啟的Intent中設置顯示的VIEW可裁剪
        intent.putExtra("crop", "true");
        // aspectX aspectY 是寬高的比例,這裡設置的是正方形(長寬比為1:1)
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // outputX outputY 是裁剪圖片寬高
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("return-data", false);

        /**
         * 此處做一個判斷
         * 1,相機取到的照片,我們把它做放到了定義的目錄下。就是file
         * 2,相冊取到的照片,這裡注意了,因為相冊照片本身有一個位置,我們進行了裁剪後,要給一個裁剪後的位置,
         *   不然onActivityResult方法中,data一直是null
         */
        if(type==CAMERA_OK)
        {
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        }else {
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
        }
        startActivityForResult(intent, CUT_OK);
    }

    /**
     * 保存裁剪之後的圖片數據 將圖片設置到imageview中
     *
     * @param picdata          資源
     */
    private void setPicToView(Intent picdata) {

        try
        {
            Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(picdata.getData()));
            img_album.setImageBitmap(bitmap);
        }catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }

}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved