您的位置:首页 > 移动开发 > Android开发

android开发之上传图片和调用相机以及相册

2015-05-19 15:34 676 查看
看图分析:

界面UI布局:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
android:background="@color/color_white">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/size_50dp" >

<TextView
android:id="@+id/viewpager_item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/size_14dp"
android:padding="@dimen/size_14dp"
android:textColor="@color/color_000"
android:textSize="@dimen/size_14dp" />

<RelativeLayout
android:id="@+id/viewpager_item_viewed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/viewpager_item_title"
android:layout_marginLeft="@dimen/size_14dp"
android:layout_marginRight="@dimen/size_14dp"
android:background="@drawable/bg_ed_shape" >

<EditText
android:id="@+id/viewpager_item_edittext"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:gravity="top"
android:hint="@string/viewpager_edittext_hint"
android:inputType="textMultiLine"
android:maxLines="50"
android:minHeight="@dimen/size_150dp"
android:padding="@dimen/size_14dp"
android:textColor="@color/color_000"
android:textColorHint="@color/color_c"
android:textSize="@dimen/size_14dp" />

<LinearLayout
android:id="@+id/viewpager_item_zp_ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/line"
android:orientation="horizontal"
android:padding="@dimen/size_10dp"
android:visibility="gone" >

<ImageView
android:id="@+id/viewpager_item_zp_1"
android:layout_width="@dimen/size_40dp"
android:layout_height="@dimen/size_40dp"
android:background="@drawable/xk" />

<ImageView
android:id="@+id/viewpager_item_zp_2"
android:layout_width="@dimen/size_40dp"
android:layout_height="@dimen/size_40dp"
android:layout_marginLeft="@dimen/size_10dp"
android:background="@drawable/xk"
android:visibility="gone" />

<ImageView
android:id="@+id/viewpager_item_zp_3"
android:layout_width="@dimen/size_40dp"
android:layout_height="@dimen/size_40dp"
android:layout_marginLeft="@dimen/size_10dp"
android:background="@drawable/xk"
android:visibility="gone" />

<ImageView
android:id="@+id/viewpager_item_zp_4"
android:layout_width="@dimen/size_40dp"
android:layout_height="@dimen/size_40dp"
android:layout_marginLeft="@dimen/size_10dp"
android:background="@drawable/xk"
android:visibility="gone" />
</LinearLayout>

<ImageView
android:id="@+id/line"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@+id/viewpager_item_edittext"
android:background="@color/color_c9" />

<RelativeLayout
android:id="@+id/viewpager_item_viewxj"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/viewpager_item_edittext"
android:layout_margin="1dp"
android:background="@color/color_bg_hui" >

<ImageView
android:id="@+id/viewpager_item_xj"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/size_13dp"
android:src="@drawable/xj" />
</RelativeLayout>

<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/viewpager_item_viewxj" />
</RelativeLayout>

<TextView
android:id="@+id/viewpager_item_next"
style="@style/bt_style_bgtowhite"
android:layout_below="@+id/viewpager_item_viewed"
android:layout_marginTop="@dimen/size_27dp" />
</RelativeLayout>

</ScrollView>


Dialog以及UI布局:

Dialog:

public class Pop_Viewpager_Item_Pz {

private static final int CAMERA_WITH_DATA = 1001;
private static final int PHOTO_PICKED_WITH_DATA = 1002;
private Activity activity;
private TextView viewpager_pop_pz_pz, viewpager_pop_pz_xc, viewpager_pop_pz_back;

public Dialog mDialog;

public Dialog getmDialog() {
return mDialog;
}

public void setmDialog(Dialog mDialog) {
this.mDialog = mDialog;
}

public Pop_Viewpager_Item_Pz(Activity context) {
activity = context;
mDialog = new Dialog(context, R.style.Setting_Question_Submit_Dialog_Style);

mDialog.setContentView(R.layout.viewpager_item_pop_pz);
Window window = mDialog.getWindow();
WindowManager wm = context.getWindowManager();
Display d = wm.getDefaultDisplay(); // 获取屏幕宽、高用
WindowManager.LayoutParams p = window.getAttributes();
p.width = (int) (d.getWidth() * 0.85);
window.setAttributes(p);
mDialog.setFeatureDrawableAlpha(Window.FEATURE_OPTIONS_PANEL, 0);
window.setWindowAnimations(android.R.anim.fade_in);

viewpager_pop_pz_pz = (TextView) mDialog.findViewById(R.id.viewpager_pop_pz_pz);
viewpager_pop_pz_pz.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
doTakePhoto(); //拍照选取图片
}
});
viewpager_pop_pz_xc = (TextView) mDialog.findViewById(R.id.viewpager_pop_pz_xc);
viewpager_pop_pz_xc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
doSelectImageFromLoacal(); //从相册中选取图片
}
});

viewpager_pop_pz_back = (TextView) mDialog.findViewById(R.id.viewpager_pop_pz_back);
viewpager_pop_pz_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
dismiss();
}
});
}

public void show() {
mDialog.show();
}

public void dismiss() {
mDialog.dismiss();
}
}


UI布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ImageView
android:id="@+id/viewpager_pop_pz_iv"
android:layout_width="match_parent"
android:layout_height="@dimen/size_20dp"
android:layout_alignParentBottom="true" />

<TextView
android:id="@+id/viewpager_pop_pz_back"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/viewpager_pop_pz_iv"
android:layout_marginTop="@dimen/size_12dp"
android:background="@drawable/viewpager_pop_pz_shape"
android:clickable="true"
android:gravity="center"
android:padding="@dimen/size_12dp"
android:text="取消"
android:textColor="@drawable/bt_bg_selector_bgtofc4025_tv"
android:textSize="@dimen/size_20dp" />

<RelativeLayout
android:id="@+id/viewpager_pop_pz"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/viewpager_pop_pz_back"
android:background="@drawable/viewpager_pop_pz_shape" >

<TextView
android:id="@+id/viewpager_pop_pz_pz"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:gravity="center"
android:padding="@dimen/size_12dp"
android:text="拍照"
android:textColor="@drawable/bt_bg_selector_bgtofc4025_tv"
android:textSize="@dimen/size_20dp" />

<ImageView
android:id="@+id/viewpager_pop_pz_line"
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_below="@+id/viewpager_pop_pz_pz"
android:background="@color/color_c9" />

<TextView
android:id="@+id/viewpager_pop_pz_xc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/viewpager_pop_pz_line"
android:clickable="true"
android:gravity="center"
android:padding="@dimen/size_12dp"
android:text="从相册选取"
android:textColor="@drawable/bt_bg_selector_bgtofc4025_tv"
android:textSize="@dimen/size_20dp" />
</RelativeLayout>

</RelativeLayout>


调用相机拍照选取图片:

通过Intent(意图)调用系统相机

/**
* 拍照获取图片
*/
public static void takePhoto(Activity activity) {

String SDState = Environment.getExternalStorageState();
if (SDState.equals(Environment.MEDIA_MOUNTED)) {

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

ContentValues values = new ContentValues();
photoUri = activity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);

activity.startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);
} else {
Toast.makeText(activity, "内存卡不存在", Toast.LENGTH_LONG).show();
}
}


调用相册选取图片:

通过Intent(意图)调用系统相册

/**
* 从本地手机中选择图片
*/
private void doSelectImageFromLoacal() {
Intent localIntent = new Intent();
localIntent.setType("image/*");
localIntent.setAction(Intent.ACTION_GET_CONTENT);
localIntent.addCategory(Intent.CATEGORY_OPENABLE);
Intent localIntent2 = Intent.createChooser(localIntent, "选择图片");
activity.startActivityForResult(localIntent2, PHOTO_PICKED_WITH_DATA);

mDialog.dismiss();
}


选取图片后压缩图片:

/**
* 压缩图片.
*/
private String ys_img(String img_path) {

String[] path_arr = img_path.split("/");
String[] name_arr = path_arr[path_arr.length - 1].split("\\.");
String path = File_Tool.SDPATH + "image/" + name_arr[0] + ".png";

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 获取这个图片的宽和高
Bitmap bitmap = BitmapFactory.decodeFile(img_path, options); // 此时返回bm为空
options.inJustDecodeBounds = false;
// 计算缩放比
int be = (int) (options.outHeight / 60);
if (be <= 0)
be = 1;
options.inSampleSize = be;
// 重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false哦
bitmap = BitmapFactory.decodeFile(img_path, options);
int w = bitmap.getWidth();
int h = bitmap.getHeight();
ImageView iv = new ImageView(this);
iv.setImageBitmap(bitmap);
//bitmap = compressImage(Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), false));
// 这样我们就可以读取较大的图片而不会内存溢出了。如果你想把压缩后的图片保存在Sdcard上的话就很简单了:
File file = new File(path);
try {
FileOutputStream out = new FileOutputStream(file);
if (bitmap.compress(Bitmap.CompressFormat.PNG, 50, out)) {
out.flush();
out.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return path;
}


上传图片:

使用AsyncTask结合Http与服务器进行交互来完成文件上传

AsyncTask

/**
* 提交用户文字以及图片答案接口数据.
*
* @author wanglei
*/
class Put_UserAnser_Task extends AsyncTask<String, Integer, String> {
ArrayList<String> id_list = new ArrayList<String>();

@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected String doInBackground(String... arg0) {
MyPhotoApp_Data_Application myphoto = (MyPhotoApp_Data_Application) getApplication();
//TODO
String url = myphoto.getUrl_host() + "port&a=userPaperAnswer" + "&sid=" + myphoto.getSessionid(), resurt = "";
ArrayList<NameValuePair> val_list = new ArrayList<NameValuePair>();
try {
val_list.add(new BasicNameValuePair("is_img", is_img > 0 ? "1" : "0")); // $is_img=1有照片,
resurt = HttpUtil.getData(MainActivity.this, url, val_list, HttpUtil.METHOD_POST);
} catch (ConnectException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return resurt;
}

@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if ("1".equals(result)) {
if (is_img > 0) {
int img_sum = 0;
Intent intent = new Intent(MainActivity.this, UploadImage_Activity.class);

for (int i=0;i<4;i++) {
img_sum++;
id_list.add(""+(i+1));
}
intent.putExtra("img_sum", img_sum);
intent.putStringArrayListExtra("id_list", id_list);
intent.putStringArrayListExtra("lists", lists);

MainActivity.this.startActivityForResult(intent, 101);
MainActivity.this.finish();
} else {
toast.setText("提交成功");
toast.show();
}
} else {
toast.setText("提交失败");
toast.show();
}
}
}


Http与服务器进行交互

public class HttpUtil {
public static final int METHOD_GET = 1;
public static final int METHOD_POST = 2;

public static String getData(Context context, String uri, List<NameValuePair> params, int method) throws ConnectException, IOException {
HttpEntity entity = getEntity(uri, params, method);
if(entity != null) {
return EntityUtils.toString(entity);
} else {
return "error";
}
}

public static HttpEntity getEntity(String uri, List<NameValuePair> params, int method) throws ConnectException, IOException {
HttpEntity entity = null;
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 20000);
HttpUriRequest request = null;
switch (method) {
case METHOD_GET:
StringBuilder sb = new StringBuilder(uri);
if (params != null && !params.isEmpty()) {
sb.append('?');
for (NameValuePair pair : params) {
sb.append(pair.getName()).append('=').append(pair.getValue()).append('&');
}
sb.deleteCharAt(sb.length() - 1);
}
request = new HttpGet(sb.toString());
break;
case METHOD_POST:
request = new HttpPost(uri);
if (params != null && !params.isEmpty()) {
UrlEncodedFormEntity reqEntity = new UrlEncodedFormEntity(params, "UTF-8");
((HttpPost) request).setEntity(reqEntity);

}
break;
}
HttpResponse response = client.execute(request);

if (response.getStatusLine().getStatusCode() == 200) {
entity = response.getEntity();
} else {

}
return entity;
}
}


自定义上传进度

public class CircleProgressBar extends View {
private int maxProgress = 100;
private int progress = 0;
private int progressStrokeWidth = 20;
// 画圆所在的距形区域
RectF oval;
Paint paint;

public CircleProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
oval = new RectF();
paint = new Paint();
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int width = this.getWidth();
int height = this.getHeight();

if (width != height) {
int min = Math.min(width, height);
width = min;
height = min;
}

paint.setAntiAlias(true); // 设置画笔为抗锯齿
paint.setColor(Color.WHITE); // 设置画笔颜色
canvas.drawColor(Color.TRANSPARENT); // 白色背景
paint.setStrokeWidth(progressStrokeWidth); // 线宽
paint.setStyle(Style.STROKE);

oval.left = progressStrokeWidth / 2; // 左上角x
oval.top = progressStrokeWidth / 2; // 左上角y
oval.right = width - progressStrokeWidth / 2; // 左下角x
oval.bottom = height - progressStrokeWidth / 2; // 右下角y

canvas.drawArc(oval, -90, 360, false, paint); // 绘制白色圆圈,即进度条背景
paint.setColor(Color.RED);
canvas.drawArc(oval, -90, ((float) progress / maxProgress) * 360, false, paint); // 绘制进度圆弧,这里是蓝色

paint.setStrokeWidth(1);
String text = progress + "%";
int textHeight = height / 4;
paint.setTextSize(textHeight);
int textWidth = (int) paint.measureText(text, 0, text.length());
paint.setStyle(Style.FILL);
canvas.drawText(text, width / 2 - textWidth / 2, height / 2 + textHeight / 2, paint);

}

public int getMaxProgress() {
return maxProgress;
}

public void setMaxProgress(int maxProgress) {
this.maxProgress = maxProgress;
}

public void setProgress(int progress) {
this.progress = progress;
this.invalidate();
}

/**
* 非UI线程调用
*/
public void setProgressNotInUiThread(int progress) {
this.progress = progress;
this.postInvalidate();
}
}


Notification 状态栏通知

private NotificationManager manager;
private Notification notif;

private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
notif.contentView.setTextViewText(R.id.content_view_text1, len + " %");
notif.contentView.setProgressBar(R.id.content_view_progress, 100, len, false);
manager.notify(0, notif);
break;
case 1:
manager.cancel(0);
break;
default:
break;
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.upload_image);
init_PutImg();
}

private void init_PutImg() {

PendingIntent pIntent = PendingIntent.getActivity(this, 0, new Intent(), 0);
manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notif = new Notification();
notif.icon = R.drawable.ic_launcher;
notif.tickerText = "正在上传作答文件";
notif.flags = Notification.FLAG_AUTO_CANCEL;

// 通知栏显示所用到的布局文件
notif.contentView = new RemoteViews(getPackageName(), R.layout.content_view);
notif.contentIntent = pIntent;
manager.notify(0, notif);
manager.cancel(0);
}


状态栏通知UI布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/size_10dp"
android:layout_marginRight="@dimen/size_10dp"
android:background="@drawable/ic_launcher" />

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/size_10dp"
android:layout_toRightOf="@+id/icon" >

<TextView
android:id="@+id/content_view_text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/size_8dp"
android:text="0 %"
android:textColor="@color/color_c50619"
android:textSize="@dimen/size_14dp" />

<ProgressBar
android:id="@+id/content_view_progress"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:layout_below="@+id/content_view_text1"
android:layout_marginTop="14dp"
android:max="100"
android:progressDrawable="@drawable/barcolor" />
</RelativeLayout>

</RelativeLayout>


示例代码戳Here
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  AsyncTask Http
相关文章推荐