Android调用拍照和本地相册并上传给服务器

这篇博客详细介绍了如何在Android应用中实现调用摄像头拍照和从本地相册选取图片的功能,并讲解了如何将选中的图片上传到服务器。通过XML布局文件和按钮操作,用户可以轻松上传故障图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.example.yaoc.myapplication;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;


import com.alibaba.fastjson.JSON;
import com.example.yaoc.myapplication.util.HttpUtil;
import com.example.yaoc.myapplication.util.LoginUserCache;
import com.example.yaoc.myapplication.util.Until;
import com.google.gson.Gson;


import net.tsz.afinal.FinalHttp;
import net.tsz.afinal.http.AjaxCallBack;
import net.tsz.afinal.http.AjaxParams;


import org.json.JSONException;
import org.json.JSONObject;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * Created by Administrator on 2016/3/2.
 */
public class UpLoadImageActivity extends Activity implements View.OnClickListener {


    private static final int SELECT_PICTURE = 1;
    private static final int SELECT_CAMER = 2;


    List<String> pathStr;
    Context mContext;


    String path = "";


    ImageView ivDelete;
    MyAdapter ImgAdapter;
    //TODO 根据这个变量来判断是否显示删除图标,true是显示,false是不显示
    private boolean isShowDelete = false;
    List<Bitmap> imgList = new ArrayList<Bitmap>();


    //TODO 上传图片的Button
    private Button add_image, btn_image, back_activity;


    private GridView gv;
    Bundle bundlefid;
    String fid;
    String code;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.uploadimage_activity);

//账户登陆后的用户code

        code = LoginUserCache.GetUserCode(this);




        initUI();


//账户登陆后前一页传来的用户id

        bundlefid = getIntent().getBundleExtra("fid");
        fid = bundlefid.getString("fid");




    }


    private void initUI() {


        gv = (GridView) findViewById(R.id.gv_img);
        btn_image = (Button) findViewById(R.id.btn_image);
        back_activity = (Button) findViewById(R.id.back_activity);


        back_activity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                Intent intent = new Intent(UpLoadImageActivity.this, ListActivity.class);
                startActivity(intent);
                finish();
            }
        });




        /**
         * 图片的控件
         */


        pathStr = new ArrayList<String>();


        mContext = this;
        ivDelete = (ImageView) findViewById(R.id.img_delete);
        add_image = (Button) findViewById(R.id.add_image);


        add_image.setOnClickListener(this);


        gv = (GridView) this.findViewById(R.id.gv_img);
        ImgAdapter = new MyAdapter();
        ImgAdapter.setIsShowDelete(isShowDelete);
        gv.setAdapter(ImgAdapter);
        /**
         * GridView的单击事件
         */
        gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {


            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                ivDelete = (ImageView) findViewById(R.id.img_delete);
                if (isShowDelete == true) {
                    //TODO 如果处于正在删除的状态,单击则删除图标消失
                    isShowDelete = false;
                    ImgAdapter.setIsShowDelete(isShowDelete);
                } else {
                    //TODO  处于正常状态
                    if (position > imgList.size() - 1) {
                        //TODO  添加图片
                        selectimg();
                    } else {
                        //TODO  跳转,可以做放大使用,自己添加吧。
                        Toast.makeText(UpLoadImageActivity.this, "长按图片进入删除状态...",
                                Toast.LENGTH_SHORT).show();
                    }
                }


                ImgAdapter.notifyDataSetChanged();
            }
        });


        /**
         * GridView长按事件
         */
        gv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {


            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                //TODO  长按显示删除图标
                if (isShowDelete == false) {
                    isShowDelete = true;
                }
                ImgAdapter.setIsShowDelete(isShowDelete);


                return true;
            }
        });




    }


    /**
     * 选择图片来源
     */
    private void selectimg() {
        final CharSequence[] items = {"拍照上传", "从相册选择"};
        new AlertDialog.Builder(this).setTitle("选择图片来源")
                .setItems(items, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        if (which == SELECT_PICTURE) {
                            toGetLocalImage();
                        } else {
                            toGetCameraImage();
                        }
                    }
                }).create().show();
    }




    /**
     * 调用图片上传的接口
     */
    private void uploadRepairRecordImageForAndroid() {


//        Toast.makeText(this, "开始上传图片...", Toast.LENGTH_SHORT).show();


        FinalHttp http = new FinalHttp();
        final AjaxParams params = new AjaxParams();


        for (int i = 0; i < pathStr.size(); i++) {
            String paths = pathStr.get(i);


            file = new File(paths);


            try {
                params.put("url", HttpUtil.IMAGESAVE_PATH);//服务器端接受图片的存放接口
                params.put("fid", fid);
                params.put("code", code);
                params.put("image" + 1, file);
                params.put("fileName", file.getName());


                Log.v("-------------", paths + "-------" + file.isFile() + "-------" + file.length());


            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }




            http.post(HttpUtil.UPLOAD_IMAGE, params, new AjaxCallBack<String>() {


                @Override
                public void onStart() {
                    super.onStart();
                    Toast.makeText(UpLoadImageActivity.this, "图片上传中...", Toast.LENGTH_LONG).show();
                }


                @Override
                public void onSuccess(String s) {
                    super.onSuccess(s);


                    /**
                     * 根据服务器返回的json数据,判断上传是否成功
                     */




                    if (s.equals("success")) {
                        Toast.makeText(UpLoadImageActivity.this, "恭喜您,图片上传成功...", Toast.LENGTH_LONG).show();
                        add_image.setVisibility(View.GONE);
                        btn_image.setVisibility(View.VISIBLE);
                    } else {
                        Toast.makeText(UpLoadImageActivity.this, "图片上传失败,请重新上传...", Toast.LENGTH_LONG).show();
                    }




                }


                @Override
                public void onFailure(Throwable t, int errorNo, String strMsg) {
                    super.onFailure(t, errorNo, strMsg);
                    Toast.makeText(UpLoadImageActivity.this, "图片上传失败...", Toast.LENGTH_SHORT).show();
                }
            });




        }




    }




    /**
     * 用于gridview显示多张照片
     *
     * @author wlc
     * @date 2015-4-16
     */
    public class MyAdapter extends BaseAdapter {


        private boolean isDelete; //TODO  用于删除图标的显隐
        private LayoutInflater inflater = LayoutInflater.from(mContext);


        @Override
        public int getCount() {


            /**
             * 需要额外多出一个用于添加图片,这里限制上传2张
             */
            return 2;


        }


        @Override
        public Object getItem(int arg0) {
            return imgList.get(arg0);
        }


        @Override
        public long getItemId(int arg0) {
            return arg0;
        }


        @Override
        public View getView(final int position, View convertView, ViewGroup arg2) {


            /**
             * 初始化页面和相关控件
             */
            convertView = inflater.inflate(R.layout.item_imgview, null);
            ImageView img_pic = (ImageView) convertView
                    .findViewById(R.id.img_pic);
            LinearLayout ly = (LinearLayout) convertView
                    .findViewById(R.id.layout);
            LinearLayout ll_picparent = (LinearLayout) convertView
                    .findViewById(R.id.ll_picparent);
            ImageView delete = (ImageView) convertView
                    .findViewById(R.id.img_delete);


            /**
             * 默认的添加图片的那个item是不需要显示删除图片的
             */
            if (imgList.size() >= 1) {
                if (position <= imgList.size() - 1) {
                    ll_picparent.setVisibility(View.GONE);
                    img_pic.setVisibility(View.VISIBLE);
                    img_pic.setImageBitmap(imgList.get(position));
                    //TODO  设置删除按钮是否显示
                    delete.setVisibility(isDelete ? View.VISIBLE : View.GONE);
                }
            }


            /**
             * 当处于删除状态时,删除事件可用
             * 注意:必须放到getView这个方法中,放到onitemClick中是不起作用的
             */
            if (isDelete) {
                delete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {


                        imgList.remove(position);
                        ImgAdapter.notifyDataSetChanged();


                    }
                });
            }


            return convertView;
        }


        /**
         * 设置是否显示删除图片
         *
         * @param isShowDelete
         */
        public void setIsShowDelete(boolean isShowDelete) {
            this.isDelete = isShowDelete;
            notifyDataSetChanged();
        }


    }




    /**
     * 选择本地图片
     */
    public void toGetLocalImage() {


        startActivityForResult(createDefaultOpenableIntent(), SELECT_PICTURE);


    }


    private Intent createDefaultOpenableIntent() {


        //选择图片 (android4.4以上版本此方法才可获得选择的图片,旧方法无效,低版本兼容此方法)
        Intent i = new Intent(
                Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        return i;
    }




    File out;


    /**
     * 照相选择图片
     */
    public void toGetCameraImage() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);
        String photoname = "a.jpg";
        out = new File(getSDPath(), photoname);
        Uri uri = Uri.fromFile(out);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(intent, SELECT_CAMER);
    }


    /**
     * 获取sd卡路径
     *
     * @return
     */
    private File getSDPath() {
        File sdDir = null;
        boolean sdCardExist = Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED); //TODO 判断sd卡是否存在
        if (sdCardExist) {
            // 这里可以修改为你的路径
            sdDir = new File(Environment.getExternalStorageDirectory()
                    + "/DCIM/Camera");


        }
        return sdDir;
    }




    File file;


    @Override
    public void onClick(View v) {


        switch (v.getId()) {
            case R.id.add_image:


                if (pathStr.size() == 0) {
                    Toast.makeText(this, "请先拍照再上传...", Toast.LENGTH_LONG).show();
                } else {
                    uploadRepairRecordImageForAndroid();
                }


                break;


        }
    }




    int count = 1;


    /**
     * 回调
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                /**
                 * 从相册选择
                 */
                case SELECT_PICTURE:
                    Uri vUri = data.getData();
                    //TODO  将图片内容解析成字节数组
                    String[] proj = {MediaStore.Images.Media.DATA};
                    Cursor cursor = managedQuery(vUri, proj, null, null, null);
                    System.out.print("cursor" + cursor);


                    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                    System.out.print("column_index" + column_index);


                    cursor.moveToFirst();
                    String path1 = cursor.getString(column_index);
                    Bitmap bm = Until.getxtsldraw(mContext, path1);




                    count++;
                    path = Until.creatfile(mContext, bm, "userImageName" + count);


                    pathStr.add(path);


                    Log.v("+++++++" + path, path);


                    if (null != bm && !"".equals(bm)) {
                        imgList.add(bm);
                    }
                    ImgAdapter.notifyDataSetChanged();
                    break;
                /**
                 * 拍照添加图片
                 */
                case SELECT_CAMER:


                    Bitmap bm1 = Until.getxtsldraw(mContext, out.getAbsolutePath());




                    count++;
                    path = Until.creatfile(mContext, bm1, "userImageName" + count);


                    pathStr.add(path);


                    Log.v("-------------路径", path);


                    if (null != bm1 && !"".equals(bm1)) {
                        imgList.add(bm1);
                    }
                    ImgAdapter.notifyDataSetChanged();
                    break;
                default:
                    break;
            }


        }


    }




}



<--------------------------------------uploadimage_activity.xml>

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




    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:text="请您选择是否上传故障图片...."
        android:textColor="#EE2C2C"
        android:textSize="30sp" />


    <GridView
        android:id="@+id/gv_img"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:horizontalSpacing="7dp"
        android:listSelector="@null"
        android:numColumns="3"
        android:paddingTop="40dp"
        android:scrollbars="none"
        android:stretchMode="columnWidth"
        android:verticalSpacing="7dp" />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:orientation="horizontal">




        <Button
            android:id="@+id/add_image"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:background="@drawable/shapes"
            android:gravity="center"
            android:text="上传" />
        <Button
            android:id="@+id/btn_image"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:gravity="center"
            android:background="@drawable/shape"
            android:visibility="gone"
            android:text="上传" />


        <Button
            android:id="@+id/back_activity"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:background="@drawable/shape"
            android:text="返回"
            android:textSize="@dimen/text_size" />


    </LinearLayout>


</LinearLayout>




<------------------------item_imgview.xml>


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical">


    <FrameLayout
        android:layout_width="80dp"
        android:layout_height="80dp">


        <!-- 添加图片,覆盖下面图片的大小 -->


        <ImageView
            android:id="@+id/img_pic"
            android:layout_width="180dp"
            android:layout_height="180dp"
            android:layout_gravity="center"
            android:src="@drawable/add_icon"
            android:visibility="gone" />


        <LinearLayout
            android:id="@+id/ll_picparent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_gravity="center"
            android:background="@drawable/image_style"
            android:gravity="center"
            android:orientation="vertical">


            <!-- 添加的图片 -->


            <ImageView
                android:layout_width="56dp"
                android:layout_height="56dp"
                android:src="@drawable/add_icon" />
            <!-- 添加的说明 -->


            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="故障图片"
                android:textColor="#b3b3b3" />
        </LinearLayout>


        <!-- 删除的图片 -->


        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">


            <ImageView
                android:id="@+id/img_delete"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:background="@drawable/img_delet"
                android:visibility="gone" />
        </RelativeLayout>
    </FrameLayout>


</LinearLayout>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值