Android开发上传图片到服务器(一.图片选择)

本文和后面一片博文,总结Android开发过程中图片选择并上传至服务器的过程:

一.图片选择  包括四种方式:拍照不截图,相册不截图 以及 拍照截图 和 相册截图

二.图片上传  Android客户端的两种图片上传的方式,以及PHP后台接收图片的代码

点击下载源码(只有图片选择)

-------------------------------------------------------------------------------------------------------------------------

首先.APP的界面如下:



主界面MainActivity的代码如下:

package com.mxd.imgupload;

import java.io.File;
import java.io.IOException;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.ContentResolver;
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.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity
{

    @SuppressLint("HandlerLeak")
    Handler handler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            if (msg.what == IMG_FROMALBUM_NOCROP)
            {// 相册+不裁剪
                img_upLoad.setImageBitmap(bmp_Icon);
                dissmissProgressDialog();
            } else if (msg.what == IMG_FROMCAMERA_NOCROP)
            {// 拍照+不裁剪
                img_upLoad.setImageBitmap(bmp_Icon);
                dissmissProgressDialog();
            } else if (msg.what == IMG_FROMALBUM_CROP)
            {// 相册+裁减
            } else if (msg.what == IMG_FROMCAMERA_CROP)
            {// 拍照+裁减
            }
        }
    };

    ImageView img_upLoad;
    Button btn_fromAlbum_noCrop, btn_fromCamera_noCrop, btn_fromAlbum_Crop, btn_fromCamera_Crop;
    private final int IMG_FROMALBUM_NOCROP = 1; // 相册+不裁剪
    private final int IMG_FROMCAMERA_NOCROP = 2; // 拍照+不裁剪
    private final int IMG_FROMALBUM_CROP = 3;// 相册+裁减
    private final int IMG_FROMCAMERA_CROP = 4;// 拍照+裁减
    private final int IMG_FROMCROP = 5;// 裁减

    Bitmap bmp_Icon = null;
    Uri imgUri;
    String localTempImgDir = "MyImg"; // 保存照片的文件夹名称
    String pic_Name = "userID_"; // 相机拍照获得的照片名称
    File dirPicSys; // 本APP的系统相册

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 在系统相册中生成一个和应用名称一样的文件夹,专门保存本APP拍照获得的照片
        localTempImgDir = getResources().getString(R.string.app_name);
        createFileInAlbum(); // 创建本APP的系统相册

        initView();
    }

    /**
     *
     * @throws IOException
     *
     * @see 在系统相册中创建一个名为localTempImgDir的相册文件夹, 用来保存本APP调用拍照功能获得的照片
     *
     */
    private void createFileInAlbum()
    {
        dirPicSys = new File(Environment.getExternalStorageDirectory() + "/" + localTempImgDir); // 获得相册文件夹路径
        if (!dirPicSys.exists())
        { // 在系统相册中创建一个名为应用名称的相册文件夹
            dirPicSys.mkdirs();
        }
    }

    private class BtnClickedListener implements OnClickListener
    {
        @Override
        public void onClick(View v)
        {
            switch (v.getId())
            {
            case R.id.btn_fromAlbum_noCrop: // 相册+不裁剪----获取的是相册中的原图
                Intent intent0 = new Intent(Intent.ACTION_GET_CONTENT, null);
                intent0.setType("image/*");// 相片类型
                startActivityForResult(intent0, IMG_FROMALBUM_NOCROP);
                break;
            case R.id.btn_fromCamera_noCrop:// 拍照+不裁剪
                try
                {
                    pic_Name = pic_Name + System.currentTimeMillis(); // 保存的照片名称为:pic_Name+系统时间
                    File outputImage = new File(dirPicSys, pic_Name + ".jpg"); // 命名生成的图片名称
                    outputImage.createNewFile();
                    imgUri = Uri.fromFile(outputImage); // imgUrl为图片保存的路径
                    // 调用系统的拍照功能
                    Intent intent1 = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    intent1.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
                    intent1.putExtra(MediaStore.EXTRA_OUTPUT, imgUri); // 指定图片输出地址
                    startActivityForResult(intent1, IMG_FROMCAMERA_NOCROP); // 启动照相
                } catch (IOException e)
                {
                    // 提示:请安装SDCard
                }
                break;
            case R.id.btn_fromAlbum_Crop:// 相册+裁减
                Intent intent2 = new Intent(Intent.ACTION_PICK, null);
                intent2.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                startActivityForResult(intent2, IMG_FROMALBUM_CROP);
                break;
            case R.id.btn_fromCamera_Crop:// 拍照+裁减
                pic_Name = pic_Name + System.currentTimeMillis(); // 保存的照片名称为:pic_Name+系统时间
                File outputImage = new File(dirPicSys, pic_Name + ".jpg"); // 命名生成的图片名称
                imgUri = Uri.fromFile(outputImage); // imgUrl为图片保存的路径
                // 调用系统的拍照功能
                Intent intent3 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                // 指定调用相机拍照后照片的储存路径
                intent3.putExtra(MediaStore.EXTRA_OUTPUT, imgUri);
                startActivityForResult(intent3, IMG_FROMCAMERA_CROP);
                break;
            default:
                break;
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, final Intent data)
    {
        if (requestCode == IMG_FROMALBUM_NOCROP)
        { // 获得相册图片
            if (data != null)
            {
                showProgressDialog("");
                new Thread()
                {// 获得的是原图,因为图片太大,使用线程读取,以防阻塞主线程
                    @Override
                    public void run()
                    {
                        try
                        {
                            ContentResolver resolver = getContentResolver();
                            Uri originalUri = data.getData(); // 获得图片的uri
                            bmp_Icon = MediaStore.Images.Media.getBitmap(resolver, originalUri);
                            handler.sendEmptyMessage(IMG_FROMALBUM_NOCROP); // 显示_相册+不裁剪图片
                        } catch (Exception e)
                        {
                        }
                    }
                }.start();
            }
        } else if (requestCode == IMG_FROMCAMERA_NOCROP)
        { // 拍照
            showProgressDialog("");
            new Thread()
            { // 获得的是原图,因为图片太大,使用线程读取,以防阻塞主线程
                @Override
                public void run()
                {
                    File f = new File(Environment.getExternalStorageDirectory() + "/" + localTempImgDir + "/" + pic_Name + ".jpg");
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inSampleSize = 4; // 此处获得的是拍照的原图,释放放小
                    bmp_Icon = BitmapFactory.decodeFile(f.getAbsolutePath(), options);
                    handler.sendEmptyMessage(IMG_FROMCAMERA_NOCROP);
                }
            }.start();
        } else if (requestCode == IMG_FROMALBUM_CROP || requestCode == IMG_FROMCAMERA_CROP)
        {
            if (requestCode == IMG_FROMALBUM_CROP)
            { // 相册+裁减
                if (data != null)
                {
                    startPhotoZoom(data.getData(), 200); // 规定截取得到的图片的长宽大小200px(此处像素值)
                }
            } else if (requestCode == IMG_FROMCAMERA_CROP)
            { // 拍照+裁减
                File f = new File(Environment.getExternalStorageDirectory() + "/" + localTempImgDir + "/" + pic_Name + ".jpg");
                startPhotoZoom(Uri.fromFile(f), 200); // 规定截取得到的图片的长宽大小200px(此处像素值)
            }
        } else if (requestCode == IMG_FROMCROP)
        {// 获得裁剪的图片,并显示
            if (data != null)
            {
                setPicToView(data);
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    private void startPhotoZoom(Uri uri, int size)
    {
        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", size);
        intent.putExtra("outputY", size);
        intent.putExtra("return-data", true);
        startActivityForResult(intent, IMG_FROMCROP);
    }
    
    // 将进行剪裁后的图片显示到UI界面上
    private void setPicToView(Intent picdata)
    {
        Bundle bundle = picdata.getExtras();
        if (bundle != null)
        {
            bmp_Icon = bundle.getParcelable("data");
            img_upLoad.setImageBitmap(bmp_Icon);
        }
    }

    private void initView()
    {
        img_upLoad = (ImageView) findViewById(R.id.img_upLoad);
        BtnClickedListener clickedListener = new BtnClickedListener();
        btn_fromAlbum_noCrop = (Button) findViewById(R.id.btn_fromAlbum_noCrop);
        btn_fromAlbum_noCrop.setOnClickListener(clickedListener);
        btn_fromCamera_noCrop = (Button) findViewById(R.id.btn_fromCamera_noCrop);
        btn_fromCamera_noCrop.setOnClickListener(clickedListener);
        btn_fromAlbum_Crop = (Button) findViewById(R.id.btn_fromAlbum_Crop);
        btn_fromAlbum_Crop.setOnClickListener(clickedListener);
        btn_fromCamera_Crop = (Button) findViewById(R.id.btn_fromCamera_Crop);
        btn_fromCamera_Crop.setOnClickListener(clickedListener);
    }

    ProgressDialog progressDialog;

    private void showProgressDialog(String hint)
    {
        if (progressDialog == null)
        {
            progressDialog = new ProgressDialog(MainActivity.this, ProgressDialog.THEME_HOLO_LIGHT);
        }
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setIndeterminate(false);
        progressDialog.setCancelable(true);
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.setMessage(hint);
        progressDialog.show();
    }

    private void dissmissProgressDialog()
    {
        if (progressDialog != null)
        {
            progressDialog.dismiss();
        }
    }

}

MainActivity的xml布局文件如下:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >


    <LinearLayout

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:orientation="vertical" >


        <ImageView

            android:id="@+id/img_upLoad"

            android:layout_width="match_parent"

            android:layout_height="300.0dip"

            android:layout_margin="11.0dip"

            android:background="@drawable/shape_img"

            android:clickable="true"

            android:contentDescription="@string/app_name"

            android:scaleType="center" />


        <LinearLayout

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_marginLeft="23.0dip"

            android:layout_marginRight="23.0dip"

            android:orientation="horizontal" >


            <Button

                android:id="@+id/btn_fromAlbum_noCrop"

                android:layout_width="0dip"

                android:layout_height="wrap_content"

                android:layout_margin="11.0dip"

                android:layout_weight="1"

                android:gravity="center"

                android:text="相册+不裁减"

                tools:ignore="ButtonStyle" />


            <Button

                android:id="@+id/btn_fromCamera_noCrop"

                android:layout_width="0dip"

                android:layout_height="wrap_content"

                android:layout_margin="11.0dip"

                android:layout_weight="1"

                android:gravity="center"

                android:text="拍照+不裁减"

                tools:ignore="ButtonStyle" />

        </LinearLayout>


        <LinearLayout

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_marginLeft="23.0dip"

            android:layout_marginRight="23.0dip"

            android:orientation="horizontal" >


            <Button

                android:id="@+id/btn_fromAlbum_Crop"

                android:layout_width="0dip"

                android:layout_height="wrap_content"

                android:layout_margin="11.0dip"

                android:layout_weight="1"

                android:gravity="center"

                android:text="相册+裁减"

                tools:ignore="ButtonStyle" />


            <Button

                android:id="@+id/btn_fromCamera_Crop"

                android:layout_width="0dip"

                android:layout_height="wrap_content"

                android:layout_margin="11.0dip"

                android:layout_weight="1"

                android:gravity="center"

                android:text="拍照+裁减"

                tools:ignore="ButtonStyle" />

        </LinearLayout>


        <Button

            android:id="@+id/btn_upLoad"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_margin="34.0dip"

            android:layout_marginTop="11.0dip"

            android:text="上    传" />

    </LinearLayout>


</ScrollView>


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值