package com.sogou.fastomiai;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Base64;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import com.sogou.fastomiai.FillInfoActivity.FileItem;
import com.sogou.fastomiai.FillInfoActivity.UserSupplementInfo;
public class FillPhotoFragment extends Fragment {
private boolean isFilled = false;
private Button mBtnPhoto1;
private Button mBtnPhoto2;
private Button mBtnVideo1;
private Button mBtnVideo2;
private ImageView mImagePhoto1;
private ImageView mImagePhoto2;
private ImageView mImagePhoto3;
private ImageView mImagePhoto4;
private Button mBtnVideo;
private Button mBtnSelPhoto;
private ImageView mImageSelPhoto;
private ArrayList<FileItem> mFiles;
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_fill_photo, container, false);
mFiles = new ArrayList<FileItem>();
mImagePhoto1 = (ImageView)v.findViewById(R.id.image_photo1);
mImagePhoto2 = (ImageView)v.findViewById(R.id.image_photo2);
mImagePhoto3 = (ImageView)v.findViewById(R.id.image_photo3);
mImagePhoto4 = (ImageView)v.findViewById(R.id.image_photo4);
mBtnPhoto1 = (Button)v.findViewById(R.id.btn_photo1);
mBtnPhoto1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mBtnSelPhoto = mBtnPhoto1;
mImageSelPhoto = mImagePhoto1;
takePhoto();
}
});
mBtnPhoto2 = (Button)v.findViewById(R.id.btn_photo2);
mBtnPhoto2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mBtnSelPhoto = mBtnPhoto2;
mImageSelPhoto = mImagePhoto2;
takePhoto();
}
});
mBtnVideo1 = (Button)v.findViewById(R.id.btn_video1);
mBtnVideo1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mBtnSelPhoto = mBtnVideo1;
mImageSelPhoto = mImagePhoto3;
takePhoto();
}
});
mBtnVideo2 = (Button)v.findViewById(R.id.btn_video2);
mBtnVideo2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mBtnSelPhoto = mBtnVideo2;
mImageSelPhoto = mImagePhoto3;
takePhoto();
}
});
mBtnVideo = (Button)v.findViewById(R.id.btn_video);
mBtnVideo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity().getApplicationContext(), "暂未实现",
Toast.LENGTH_SHORT).show();
}
});
return v;
}
public void takePhoto() {
CharSequence[] items = {"从相册选择", "拍照", "取消"};
new AlertDialog.Builder(getActivity())
.setTitle("选择图片来源")
.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if ( which == 0 ){
try {
//选择照片的时候也一样,我们用Action为Intent.ACTION_GET_CONTENT,
//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 2);
} catch (ActivityNotFoundException e) {
}
} else if (which == 1) {
try {
//拍照我们用Action为MediaStore.ACTION_IMAGE_CAPTURE,
//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
} catch (Exception e) {
e.printStackTrace();
}
} else {
}
}
})
.create().show();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case Activity.RESULT_OK:
if (data != null) {
// 从相册选择
ContentResolver resolver = getActivity().getContentResolver();
// 照片的原始资源地址
Uri originalUri = data.getData();
try {
// 使用ContentProvider通过URI获取原始图片
Bitmap photo = MediaStore.Images.Media.getBitmap(resolver,
originalUri);
if (photo != null) {
// 为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始Bitmap占用的内存
int SCALE = photo.getWidth() / 640;
if (SCALE < 1) {
SCALE = 1;
}
Bitmap smallBitmap = zoomBitmap(photo,
photo.getWidth() / SCALE, photo.getHeight() / SCALE);
// 释放原始图片占用的内存,防止out of memory异常发生
if (SCALE != 1) {
photo.recycle();
}
mBtnSelPhoto.setVisibility(View.GONE);
mImageSelPhoto.setVisibility(View.VISIBLE);
mImageSelPhoto.setImageBitmap(smallBitmap);
isFilled = true;
FileItem item = new FileItem();
item.name = String.valueOf(System.currentTimeMillis())
+ ".jpg";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
smallBitmap.compress(Bitmap.CompressFormat.PNG, 100,
baos);
item.file = Base64.encodeToString(baos.toByteArray(),
Base64.DEFAULT);
mFiles.add(item);
try {
File file = new File(
Environment.getExternalStorageDirectory(),
"fastomiai.jpg");
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.close();
} catch (Exception e) {
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} else {
// 拍照后
Bundle extras = data.getExtras();
if (extras != null) {
// 这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片
Bitmap image = extras.getParcelable("data");
if (image != null) {
mBtnSelPhoto.setVisibility(View.GONE);
mImageSelPhoto.setVisibility(View.VISIBLE);
mImageSelPhoto.setImageBitmap(image);
isFilled = true;
FileItem item = new FileItem();
item.name = String.valueOf(System.currentTimeMillis())
+ ".png";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.PNG, 100, baos);
item.file = Base64.encodeToString(baos.toByteArray(),
Base64.DEFAULT);
mFiles.add(item);
try {
File file = new File(
Environment.getExternalStorageDirectory(),
"fastomiai.png");
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.close();
} catch (Exception e) {
}
}
}
}
}
}
/** 缩放Bitmap图片 **/
public Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {
int w = bitmap.getWidth();
int h = bitmap.getHeight();
Matrix matrix = new Matrix();
float scaleWidth = ((float) width / w);
float scaleHeight = ((float) height / h);
matrix.postScale(scaleWidth, scaleHeight);// 利用矩阵进行缩放不会造成内存溢出
Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
return newbmp;
}
public void fillInfo(UserSupplementInfo info) {
info.photo = new ArrayList<FileItem>();
info.vedio = new ArrayList<FileItem>();
if (mFiles.size() != 0) {
info.photo = mFiles;
}
}
public boolean isFilled() {
return isFilled;
}
}