最近在边学边做东西,这个功能着实让我焦灼了很久。把整理好的代码跟大家分享一下。水平比较菜,欢迎大家指出不足。

这里没有提供上传方法,只提供了获取图片路径的方式,只要获取了图片路径,就可以根据图片路径创建文件输出流来上传到服务器。

直接上代码
Java代码:

package com.example.admin.uploadpicture;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;

public class MainActivity extends Activity {
    private Button bt_loc,bt_cam;
    private ImageView img;
    private File currentImageFile = null;
    String srcPath="";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindView();//绑定控件
        bt_cam.setOnClickListener(new myListener());
        bt_loc.setOnClickListener(new myListener());
    }
    protected void onActivityResult(int requestCode,int resultCode,Intent data){
        switch (requestCode){
            case 1:
                img.setImageURI(Uri.fromFile(currentImageFile));
                break;
            case 2:
                //根据android.net.Uri获取图片路径的方法
                Uri uri = data.getData();
                img.setImageURI(uri);
                ContentResolver cr = this.getContentResolver();
                Cursor c = cr.query(uri, null, null, null, null);
                c.moveToFirst();
                //这是获取的图片保存在sdcard中的位置
                srcPath = c.getString(c.getColumnIndex("_data"));//获取文件的保存路径,这里和拍照的文件格式一样,统一了路径
        }
        //最后不管是本地的还是拍照的,都取得了图片的路径,可以根据图片的路径来进行上传图片
        //此处验证并显示取得的图片的路径
        Toast.makeText(MainActivity.this,srcPath, Toast.LENGTH_SHORT).show();
    }
    private void bindView() {
        bt_cam=(Button)findViewById(R.id.bt_cam);
        bt_loc=(Button)findViewById(R.id.bt_loc);
        img = (ImageView) findViewById(R.id.img);
    }
    //拍照和取本地图片按钮的监听器
    public class myListener implements View.OnClickListener{
        @Override
        public void onClick(View view) {
            switch(view.getId()){
                case R.id.bt_cam:
                    //拍照按钮的监听方法
                    String dirName="pictures";//目录中文件夹名称
                    File dir = new File(Environment.getExternalStorageDirectory(),dirName);
                    if(dir.exists()){
                        dir.mkdirs();
                    }
                    String fileName=System.currentTimeMillis()+".jpg";//目录中文件名称
                    currentImageFile = new File(dir,fileName);
//下面这段代码最好不要加,只创建文件(new File),而不去调用creatNewFile具体创建文件。而是等待相机拍完照片后,自动按照文件路径生成文件
//加了出现的问题就是,跳转到拍照界面,但是并没有拍照,也会自动创建空文件 ,属于垃圾文件。
//                    if(!currentImageFile.exists()){
//                        try {
//                            currentImageFile.createNewFile();
//                        } catch (IOException e) {
//                            e.printStackTrace();
//                        }
//                    }
                    //获取拍照保存的照片的路径
                    srcPath=Environment.getExternalStorageDirectory().toString()+"/"+dirName+"/"+fileName;//文件的路径,根据根目录,文件夹名称,文件名称拼接而成
                    //设置Intent拍照动作
                    Intent it_cam = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    //设置存储方式外部存储,设置存储路径
                    it_cam.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(currentImageFile));//涉及到存储的时候一定要注意权限的添加
                    startActivityForResult(it_cam,1);
                    break;
                case R.id.bt_loc:
                    //本地按钮的监听方法
                    Intent it_loc=new Intent();
                    it_loc.setType("image/*");
                    it_loc.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(it_loc,2);
                    break;
            }

        }
    }
}

//切记一点要添加权限,存储和拍照都需要权限
//优点:照片清晰度比较高,先存储,后调用。网上有的方法有了这个优点,但是会创建无用的空文件,这只要去掉部分代码就可以,具体的已经在代码中注释了
xml代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/img"
android:layout_height="420dp"
android:layout_width="fill_parent"/>
<Button
android:id="@+id/bt_cam"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="拍照上传"
/>
<Button
android:id="@+id/bt_loc"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="本地上传"
/>
</LinearLayout>

mainfest代码中要添加这两句权限代码(拍照和存储权限),否则会出问题。

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>