最近在边学边做东西,这个功能着实让我焦灼了很久。把整理好的代码跟大家分享一下。水平比较菜,欢迎大家指出不足。
这里没有提供上传方法,只提供了获取图片路径的方式,只要获取了图片路径,就可以根据图片路径创建文件输出流来上传到服务器。
直接上代码
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"/>