1. 程式人生 > >Android之拍照和相簿選取圖片並裁剪得到路徑

Android之拍照和相簿選取圖片並裁剪得到路徑

-----------------轉載請註明出處:http://blog.csdn.net/android_cll

一:先來兩張效果圖:

1.這是我們專案用到這個功能的截圖、



2.demo的截圖,功能和上面截圖功能一樣,懶得截圖、


二:實現步驟:

1.xml的實現、

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height=
"match_parent"> <ImageView android:id="@+id/logo" android:layout_width="114dp" android:layout_height="114dp" android:layout_centerInParent="true" android:src="@mipmap/ic_launcher" /> <RelativeLayoutandroid:id="@+id/relative_logo" android:layout_width="280dp" android:layout_height="50dp"
android:layout_below="@+id/logo" android:layout_centerHorizontal="true" android:layout_marginTop="20dp" android:background="@drawable/tankuan"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="點選拍照或選擇相簿"
android:textColor="#fff" android:textSize="16dp" /> </RelativeLayout> </RelativeLayout>
2.activity的實現、
package cll.com.myapplication;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import java.io.File;
/**
 * Created by Administrator on 2017/3/28.
 * 拍照和相簿選取圖片並裁剪得到圖片路徑和圖片顯示
 */
public class PhotoShoot extends Activity implements View.OnClickListener {

    private ImageView logo;//圖片
private RelativeLayout relative_logo;//點選拍照或者選擇相簿圖片
private String urlpath;//圖片路徑
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.photoshoot_layout);
initlayout();
}

    /**
     * 例項化
     */
private void initlayout() {
        logo = (ImageView) findViewById(R.id.logo);
relative_logo = (RelativeLayout) findViewById(R.id.relative_logo);
relative_logo.setOnClickListener(this);
}

    /**
     * 點選事件
     *
     * @param view
*/
@Override
public void onClick(View view) {
        switch (view.getId()) {
            case R.id.relative_logo:
                new ActionSheetDialog(PhotoShoot.this)
                        .builder()
                        .setCancelable(true)
                        .setCanceledOnTouchOutside(true)
                        .addSheetItem("相簿",
ActionSheetDialog.SheetItemColor.Blue,
                                new ActionSheetDialog.OnSheetItemClickListener() {

                                    @Override
public void onClick(int which) {

                                        Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(
                                                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent, 1);
}
                                })
                        .addSheetItem("拍照",
ActionSheetDialog.SheetItemColor.Blue,
                                new ActionSheetDialog.OnSheetItemClickListener() {

                                    @Override
public void onClick(int which) {
                                        Intent intent = new Intent(
                                                MediaStore.ACTION_IMAGE_CAPTURE);
//下面這句指定呼叫相機拍照後的照片儲存的路徑
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
                                                .fromFile(new File(Environment
                                                        .getExternalStorageDirectory(),
"xiaoma.jpg")));
startActivityForResult(intent, 2);
}
                                }).show();
                break;
}
    }

    @SuppressLint("SimpleDateFormat")
    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != Activity.RESULT_CANCELED) {
            switch (requestCode) {
                // 如果是直接從相簿獲取
case 1:
                    startPhotoZoom(data.getData());
                    break;
// 如果是呼叫相機拍照時
case 2:
                    File temp = new File(Environment.getExternalStorageDirectory()
                            + "/xiaoma.jpg");
startPhotoZoom(Uri.fromFile(temp));
                    break;
// 取得裁剪後的圖片
case 3:
                    if (data != null) {
                        setPicToView(data);
}
                    break;
                default:
                    break;
}
            super.onActivityResult(requestCode, resultCode, data);
}
    }

    /**
     * 裁剪圖片方法實現
     *
     * @param uri
*/
public void startPhotoZoom(Uri uri) {
        Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
//下面這個crop=true是設定在開啟的Intent中設定顯示的VIEW可裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是寬高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪圖片寬高
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, 3);
}

    /**
     * 儲存裁剪之後的圖片資料
     *
     * @param picdata
*/
private void setPicToView(Intent picdata) {
        Bundle extras = picdata.getExtras();
        if (extras != null) {
            Bitmap photo = extras.getParcelable("data");
//圖片路徑
urlpath = FileUtilcll.saveFile(PhotoShoot.this, "temphead.jpg", photo);
System.out.println("----------路徑----------" + urlpath);
logo.setImageBitmap(photo);
}
    }
}
3.路徑獲取工具類、
package cll.com.myapplication;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.os.Environment;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class FileUtilcll {

    /**
     * 將Bitmap 圖片儲存到本地路徑,並返回路徑
     * @param fileName 檔名稱
     * @param bitmap   圖片
     * @param資源型別,參照 MultimediaContentType 列舉,根據此型別,儲存時可自動歸類
     */
public static String saveFile(Context c, String fileName, Bitmap bitmap) {
        return saveFile(c, "", fileName, bitmap);
}

    public static String saveFile(Context c, String filePath, String fileName, Bitmap bitmap) {
        byte[] bytes = bitmapToBytes(bitmap);
        return saveFile(c, filePath, fileName, bytes);
}

    public static byte[] bitmapToBytes(Bitmap bm) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(CompressFormat.JPEG, 100, baos);
        return baos.toByteArray();
}

    public static String saveFile(Context c, String filePath, String fileName, byte[] bytes) {
        String fileFullName = "";
FileOutputStream fos = null;
String dateFolder = new SimpleDateFormat("yyyyMMddHHmmss", Locale.CHINA)
                .format(new Date());
        try {
            String suffix = "";
            if (filePath == null || filePath.trim().length() == 0) {
                filePath = Environment.getExternalStorageDirectory() + "/XiaoCao/" + dateFolder + "/";
}
            File file = new File(filePath);
            if (!file.exists()) {
                file.mkdirs();
}
            File fullFile = new File(filePath, fileName + suffix);
fileFullName = fullFile.getPath();
fos = new FileOutputStream(new File(filePath, fileName + suffix));
fos.write(bytes);
} catch (Exception e) {
            fileFullName = "";
} finally {
            if (fos != null) {
                try {
                    fos.close();
} catch (IOException e) {
                    fileFullName = "";
}
            }
        }
        return fileFullName;
}
}
4.彈框的工具類、
package cll.com.myapplication;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ScrollView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
/**
 * 彈框工具類
 */
public class ActionSheetDialog {
    private Context context;
    private Dialog dialog;
    private TextView txt_title;
    private TextView txt_cancel;
    private LinearLayout lLayout_content;
    private ScrollView sLayout_content;
    private boolean showTitle = false;
    private List<SheetItem> sheetItemList;
    private Display display;
    public ActionSheetDialog(Context context) {
        this.context = context;
WindowManager windowManager = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
display = windowManager.getDefaultDisplay();
}

    public ActionSheetDialog builder() {
        View view = LayoutInflater.from(context).inflate(
                R.layout.view_actionsheet, null);
view.setMinimumWidth(display.getWidth());
sLayout_content = (ScrollView) view.findViewById(R.id.sLayout_content);
lLayout_content = (LinearLayout) view
                .findViewById(R.id.lLayout_content);
txt_title = (TextView) view.findViewById(R.id.txt_title);
txt_cancel = (TextView) view.findViewById(R.id.txt_cancel);
txt_cancel.setOnClickListener(new OnClickListener() {
            @Override
public void onClick(View v) {
                dialog.dismiss();
}
        });
dialog = new Dialog(context, R.style.ActionSheetDialogStyle);
dialog.setContentView(view);
Window dialogWindow = dialog.getWindow();
dialogWindow.setGravity(Gravity.LEFT | Gravity.BOTTOM);
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.x = 0;
lp.y = 0;
dialogWindow.setAttributes(lp);
        return this;
}

    public ActionSheetDialog setTitle(String title) {
        showTitle = true;
txt_title.setVisibility(View.VISIBLE);
txt_title.setText(title);
        return this;
}

    public ActionSheetDialog setCancelable(boolean cancel) {
        dialog.setCancelable(cancel);
        return this;
}

    public ActionSheetDialog setCanceledOnTouchOutside(boolean cancel) {
        dialog.setCanceledOnTouchOutside(cancel);
        return this;
}

    /**
     * @param strItem
* @param color
* @param listener
* @return
*/
public ActionSheetDialog addSheetItem(String strItem, SheetItemColor color,
OnSheetItemClickListener listener) {
        if (sheetItemList == null) {
            sheetItemList = new ArrayList<SheetItem>();
}
        sheetItemList.add(new SheetItem(strItem, color, listener));
        return this;
}

    private void setSheetItems() {
        if (sheetItemList == null || sheetItemList.size() <= 0) {
            return;
}

        int size = sheetItemList.size();
        if (size >= 7) {
            LayoutParams params = (LayoutParams) sLayout_content
.getLayoutParams();
params.height = display.getHeight() / 2;
sLayout_content.setLayoutParams(params);
}

        for (int i = 1; i <= size; i++) {
            final int index = i;
SheetItem sheetItem = sheetItemList.get(i - 1);
String strItem = sheetItem.name;
SheetItemColor color = sheetItem.color;
            final OnSheetItemClickListener listener = (OnSheetItemClickListener) sheetItem.itemClickListener;
TextView textView = new TextView(context);
textView.setText(strItem);
textView.setTextSize(18);
textView.setGravity(Gravity.CENTER);
            if (size == 1) {
                if (showTitle) {
                    textView.setBackgroundResource(R.drawable.actionsheet_bottom_selector);
} else {
                    textView.setBackgroundResource(R.drawable.actionsheet_single_selector);
}
            } else {
                if (showTitle) {
                    if (i >= 1 && i < size) {
                        textView.setBackgroundResource(R.drawable.actionsheet_middle_selector);
} else {
                        textView.setBackgroundResource(R.drawable.actionsheet_bottom_selector);
}
                } else {
                    if (i == 1) {
                        textView.setBackgroundResource(R.drawable.actionsheet_top_selector);
} else if (i < size) {
                        textView.setBackgroundResource(R.drawable.actionsheet_middle_selector);
} else {
                        textView.setBackgroundResource(R.drawable.actionsheet_bottom_selector);
}
                }
            }

            if (color == null) {
                textView.setTextColor(Color.parseColor(SheetItemColor.Blue
.getName()));
} else {
                textView.setTextColor(Color.parseColor(color.getName()));
}

            float scale = context.getResources().getDisplayMetrics().density;
            int height = (int) (45 * scale + 0.5f);
textView.setLayoutParams(new LayoutParams(
                    LayoutParams.MATCH_PARENT, height));
textView.setOnClickListener(new OnClickListener() {
                @Override
public void onClick(View v) {
                    listener.onClick(index);
dialog.dismiss();
}
            });
lLayout_content.addView(textView);
}
    }

    public void show() {
        setSheetItems();
dialog.show();
}

    public interface OnSheetItemClickListener {
        void onClick(int which);
}

    public class SheetItem {
        String name;
OnSheetItemClickListener itemClickListener;
SheetItemColor color;
        public SheetItem(String name, SheetItemColor color,
OnSheetItemClickListener itemClickListener) {
            this.name = name;
            this.color = color;
            this.itemClickListener = itemClickListener;
}
    }

    public enum SheetItemColor {
        Blue("#037BFF"), Red("#FD4A2E");
        private String name;
        private SheetItemColor(String name) {
            this.name = name;
}

        public String getName() {
            return name;
}

        public void setName(String name) {
            this.name = name;
}
    }
}

-------------------到這差不多就這些東西了,一般我都會附上原始碼,貼出來的程式碼都有註釋,不懂得自己下原始碼看,大神勿噴。