以前做项目在选择图片及上传这个功能上总是会有bug,要么是选择图片时内存溢出要么获取不到图片,今天整理了下图片上传的代码,发出来希望能帮到大家,也希望提出意见。
//部分代码如下
package com.example.imageupload;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import com.example.imageupload.ActionSheet.OnActionSheetSelected;
public class MainActivity extends Activity implements OnActionSheetSelected, OnCancelListener {
private static int CAMERA_REQUEST_CODE = 1;
private static int GALLERY_REQUEST_CODE = 2;
private static int CROP_REQUEST_CODE = 3;
private Bitmap bm;
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ActionSheet.showSheet(MainActivity.this, MainActivity.this, MainActivity.this, "1");
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST_CODE) {
if (data == null) {
return;
} else {
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap bm = extras.getParcelable("data");
Uri uri = saveBitmap(bm);
startImageZoom(uri);
}
}
} else if (requestCode == GALLERY_REQUEST_CODE) {
if (data == null) {
return;
}
Uri uri;
uri = data.getData();
Uri fileUri = convertUri(uri);
startImageZoom(fileUri);
} else if (requestCode == CROP_REQUEST_CODE) {
if (data == null) {
return;
}
Bundle extras = data.getExtras();
if (extras == null) {
return;
}
bm = extras.getParcelable("data");
iv.setImageBitmap(bm);
sendImage(bm);
}
}
private void sendImage(Bitmap bm2) {
// TODO Auto-generated method stub
String ifpic = "";
if (bm == null) {
ifpic = "N";
} else {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 60, stream);
byte[] bytes = stream.toByteArray();
File tmpDir = new File(Environment.getExternalStorageDirectory() + "/com.example.imageupload");
if (!tmpDir.exists()) {
tmpDir.mkdir();
}
final File tempf = getFileFromBytes(bytes, tmpDir.getAbsolutePath() + "/avatertemp.png");
ifpic = "Y";
// 上传文件的网络操作
}
}
private Uri saveBitmap(Bitmap bm) {
File tmpDir = new File(Environment.getExternalStorageDirectory() + "/com.example.imageupload");
if (!tmpDir.exists()) {
tmpDir.mkdir();
}
File img = new File(tmpDir.getAbsolutePath() + "/avater.png");
try {
FileOutputStream fos = new FileOutputStream(img);
bm.compress(Bitmap.CompressFormat.PNG, 85, fos);
fos.flush();
fos.close();
return Uri.fromFile(img);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private Uri convertUri(Uri uri) {
InputStream is = null;
try {
is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();
return saveBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
private void startImageZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, CROP_REQUEST_CODE);
}
public static File getFileFromBytes(byte[] b, String outputFile) {
BufferedOutputStream stream = null;
File file = null;
try {
file = new File(outputFile);
FileOutputStream fstream = new FileOutputStream(file);
stream = new BufferedOutputStream(fstream);
stream.write(b);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
return file;
}
@Override
public void onCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
}
@Override
public void onClick(int whichButton) {
// TODO Auto-generated method stub
if (whichButton == 1) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA_REQUEST_CODE);
} else if (whichButton == 2) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, GALLERY_REQUEST_CODE);
}
}
}
</pre><pre name="code" class="java">package com.example.imageupload;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface.OnCancelListener;
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.TextView;
public class ActionSheet {
public interface OnActionSheetSelected {
void onClick(int whichButton);
}
private ActionSheet() {
}
/**
*
* @param context
* @param actionSheetSelected
* @param cancelListener
* @param type
* 1.上传照片 2.预览下载
* @return
*/
public static Dialog showSheet(Context context,
final OnActionSheetSelected actionSheetSelected,
OnCancelListener cancelListener, String type) {
final Dialog dlg = new Dialog(context, R.style.ActionSheet);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout layout = (LinearLayout) inflater.inflate(
R.layout.actionsheet, null);
final int cFullFillWidth = 10000;
layout.setMinimumWidth(cFullFillWidth);
final TextView take_picture = (TextView) layout
.findViewById(R.id.take_picture);
final TextView choose_local = (TextView) layout
.findViewById(R.id.choose_local);
final TextView tv_download = (TextView) layout
.findViewById(R.id.tv_download);
final TextView tv_preview = (TextView) layout
.findViewById(R.id.tv_preview);
final TextView delete_pic = (TextView) layout
.findViewById(R.id.delete_pic);
final TextView mCancel = (TextView) layout.findViewById(R.id.cancel);
if (type.equals("1")) {
take_picture.setVisibility(View.VISIBLE);
choose_local.setVisibility(View.VISIBLE);
delete_pic.setVisibility(View.GONE);
tv_download.setVisibility(View.GONE);
tv_preview.setVisibility(View.GONE);
} else if (type.equals("2")) {
take_picture.setVisibility(View.GONE);
choose_local.setVisibility(View.GONE);
delete_pic.setVisibility(View.GONE);
tv_download.setVisibility(View.VISIBLE);
tv_preview.setVisibility(View.VISIBLE);
}
take_picture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 拍照
actionSheetSelected.onClick(1);
dlg.dismiss();
}
});
choose_local.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 选择本地照片
actionSheetSelected.onClick(2);
dlg.dismiss();
}
});
tv_download.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 预览
actionSheetSelected.onClick(4);
dlg.dismiss();
}
});
tv_preview.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 下载
actionSheetSelected.onClick(3);
dlg.dismiss();
}
});
mCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
actionSheetSelected.onClick(6);
dlg.dismiss();
}
});
delete_pic.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
actionSheetSelected.onClick(5);
dlg.dismiss();
}
});
Window w = dlg.getWindow();
WindowManager.LayoutParams lp = w.getAttributes();
lp.x = 0;
final int cMakeBottom = -1000;
lp.y = cMakeBottom;
lp.gravity = Gravity.BOTTOM;
dlg.onWindowAttributesChanged(lp);
dlg.setCanceledOnTouchOutside(true);
if (cancelListener != null)
dlg.setOnCancelListener(cancelListener);
dlg.setContentView(layout);
dlg.show();
return dlg;
}
}
demo 下载地址:
http://download.csdn.net/detail/maweisky531/8983697