Android拍照或本地图片上传

        前几天,我们客户端这边收到了市场部的一个需求,需要在我们订单成交后,我们的客户端有一个上传交易凭证的功能,那么如何在Android实现上传图片的这个功能呢?在我进行编码之前,我先问自己几个问题。

第一, 图片是直接选择图库里的,还是需要拍照和选择图片两个选项?

因为在选择图片的时候,会有一个拍照的按钮,也可以实现拍照的功能。

第二, 需不需要本地缓存?

 本地缓存值得是,在我们的图片上传后,是否在下次直接显示,而不是从服务器读取。

第三,图片是否需要压缩?

众所周知,图片这种资源,因为体积较大,在网络上传输还是很慢的,所以,我们需要在我们的传输时,适当的对文件的大小进行压缩,那么就要根据我们自身的需求,按照一定的比例来进行压缩。

在思考完这几个问题后,根据我们自己的需求,我们在上传时有两个选项的,一个是拍照,一个是选择图片,另外我们需要做本地缓存,还有,图片上传不需要压缩。

那么我们就可以开始实现了,首先在我们的主fragment里,添加如下代码,如果你是activity,当然也可以。

做一个ImageView,作为我们上传的图像。

    mPic1 = (ImageView) view.findViewById(R.id.ImageView01);
    mPic1.setOnClickListener(mPhotoListener);

    private View.OnClickListener mPhotoListener = new View.OnClickListener() {
		
		@Override
		public void onClick(View v) {
			int id = v.getId();
			if (id == R.id.ImageView01) {
				Intent popupIntent = new Intent(getActivity(), PopupActivity.class);
				mPhotoId = id;
				startActivityForResult(popupIntent, 1);
			}
		}
	};
    

然后,我们跳转到另外一个PopupActivity,让我们选择,

PopupActivity.java


package com.chuanlaoda.android.activity;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.chuanloada.android.R;

public class PopupActivity extends Activity implements OnClickListener {
    private Button btn_take_photo, btn_pick_photo, btn_cancel;
    private LinearLayout layout;
    private Intent intent;

    private Button showList;
    private Button uploadNow;
    private String mCurrentPhotoPath;
    private Bitmap sourcePic;
    private File dir = null;

    private String picName = null;
    private String uploadFile = null;

    static Uri capturedImageUri=null;
    private Bitmap bitmap = null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.popup);
        intent = getIntent();
        btn_take_photo = (Button) this.findViewById(R.id.btn_take_photo);
        btn_pick_photo = (Button) this.findViewById(R.id.btn_pick_photo);
        btn_cancel = (Button) this.findViewById(R.id.btn_cancel);

        layout = (LinearLayout) findViewById(R.id.pop_layout);

        layout.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "提示:点击空白地方可以关闭",
                        Toast.LENGTH_SHORT).show();
            }
        });

        btn_cancel.setOnClickListener(this);
        btn_pick_photo.setOnClickListener(this);
        btn_take_photo.setOnClickListener(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        finish();
        return true;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        
        if (resultCode != RESULT_OK) {
            return;
        }
        if (data != null) {
            if (data.getExtras() != null)
            {
                bitmap = (Bitmap) data.getExtras().get("data");
                intent.putExtras(data.getExtras());
                intent.putExtra("uri", capturedImageUri);
                intent.putExtra("requestCode", requestCode);
                intent.putExtra("image", bitmap);
            }
            
            if (data.getData() != null)
                intent.setData(data.getData());            
        }
        setResult(requestCode, intent);
        finish();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_take_photo:
            dispatchTakePictureIntent();
            break;
        case R.id.btn_pick_photo:
            try {

                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(intent, 2);
            } catch (ActivityNotFoundException e) {

            }
            break;
        case R.id.btn_cancel:
            finish();
            break;
        default:
            break;
        }
    }
    
    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        mCurrentPhotoPath = "file:" + image.getAbsolutePath();
        return image;
    }
    
    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Ensure that there's a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File
            }
            // Continue only if the File was successfully created
            capturedImageUri = Uri.fromFile(photoFile);
            if (photoFile != null) {
                //takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, capturedImageUri);
                startActivityForResult(takePictureIntent, 1);
            }
        }
    }
}
Popup.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="vertical"
  >

<LinearLayout 
    android:id="@+id/pop_layout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:layout_alignParentBottom="true"
     android:background="@drawable/btn_style_alert_dialog_background"
     >

    
    <Button
        android:id="@+id/btn_take_photo"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:layout_marginTop="20dip"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="拍照"
        android:background="@drawable/btn_style_alert_dialog_button"
        android:textStyle="bold"
         />

    <Button
        android:id="@+id/btn_pick_photo"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
        android:layout_marginTop="5dip" 
         android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="从相册选择"
         android:background="@drawable/btn_style_alert_dialog_button"
         android:textStyle="bold"
         />

    <Button
        android:id="@+id/btn_cancel"
       android:layout_marginLeft="20dip"
       android:layout_marginRight="20dip"
       android:layout_marginTop="15dip" 
	   android:layout_marginBottom="15dip"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="取消"
       android:background="@drawable/btn_style_alert_dialog_cancel"
       android:textColor="#ffffff"
       android:textStyle="bold"
       
        />
</LinearLayout>
</RelativeLayout>
接下来就是我们需要在我们的主fragment (或者activity)中添加onActivityResult.

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    	photo = (ImageView) mView.findViewById(mPhotoId);
    	String pfid=String.valueOf(BusinessDetailsFragment.getPosition(mPhotoId) + 1);
    	String gsid=String.valueOf(mBusinessId);
    	String cur_date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
    	switch (resultCode) {
		case 1:
			if (data != null) {
				Uri mImageCaptureUri = (Uri) data.getExtras().get("uri");
				if (mImageCaptureUri != null) {
					Bitmap image;
					try {
						//image = MediaStore.Images.Media.getBitmap(this.getActivity().getContentResolver(), mImageCaptureUri);
						image = (Bitmap) data.getExtras().get("image");
						String fileFullPath = PhotoAPI.savePicsToSdcard(image, mFileLoc);
						PromptUtils.showProgressDialog(getActivity(), "正在上传照片");
					    mResult = PhotoAPI.uploadFile(gsid, pfid, fileFullPath);
					    Cache.addLastPhotoPath(pfid, fileFullPath);
					    Cache.addLastPhotoDate(gsid, cur_date);
					    PromptUtils.dismissProgressDialog();
					    
					    showDialog(mResult);
						if (image != null) {
							photo.setImageBitmap(image);
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				} else {
					Bundle extras = data.getExtras();
					if (extras != null) {
						Bitmap image = extras.getParcelable("data");
						String fileFullPath = PhotoAPI.savePicsToSdcard(image, mFileLoc);
						
						PromptUtils.showProgressDialog(getActivity(), "正在上传照片");
					    mResult = PhotoAPI.uploadFile(gsid, pfid, fileFullPath);
					    PromptUtils.dismissProgressDialog();
					    Cache.addLastPhotoPath(pfid, fileFullPath);
					    Cache.addLastPhotoDate(gsid, cur_date);
					    showDialog(mResult);
						if (image != null) {
							photo.setImageBitmap(image);
						}
					}
				}
			}
			break;
		case 2:
			if (data != null) {
				Uri mImageCaptureUri = data.getData();
				if (mImageCaptureUri != null) {
					Bitmap image;
					try {
						image = MediaStore.Images.Media.getBitmap(this.getActivity().getContentResolver(), mImageCaptureUri);					
						String fileFullPath = getRealPathFromURI(this.getActivity(),mImageCaptureUri);
						PromptUtils.showProgressDialog(getActivity(), "正在上传照片");
					    mResult = PhotoAPI.uploadFile(gsid, pfid, fileFullPath);
					    PromptUtils.dismissProgressDialog();
					    Cache.addLastPhotoPath(pfid, fileFullPath);
					    Cache.addLastPhotoDate(gsid, cur_date);
					    showDialog(mResult);
						if (image != null) {
							photo.setImageBitmap(image);
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				} else {
					Bundle extras = data.getExtras();
					if (extras != null) {
						String fileFullPath = getRealPathFromURI(this.getActivity(),mImageCaptureUri);
						PromptUtils.showProgressDialog(getActivity(), "正在上传照片");
						mResult = PhotoAPI.uploadFile(gsid, pfid, fileFullPath);
						PromptUtils.dismissProgressDialog();
						Cache.addLastPhotoPath(pfid, fileFullPath);
						Cache.addLastPhotoDate(gsid, cur_date);
						Bitmap image = extras.getParcelable("data");
						if (image != null) {
							photo.setImageBitmap(image);
						}
					}
				}
			}
			break;
		default:
			break;

		}
    }

另外,我们处理图片上传的代码在这里。

class UploadThread extends Thread {
	private String result = "";
	private String actionUrl;
	private String uploadFile;
	
	public UploadThread(String gsid, String pfid, String uploadFile) {
		String baseUrl = APIConfig.getAPIHost() + "uploadProof";
		this.actionUrl=baseUrl+"&gsid=" + gsid + "&pfid="+pfid; 
		this.uploadFile = uploadFile;
	}
	
	@Override
	public void run() {
		String end = "\r\n";
		String twoHyphens = "--";
		String boundary = "*****";
		try {

			URL url = new URL(actionUrl);
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			/* 允许Input、Output,不使用Cache */
			con.setDoInput(true);
			con.setDoOutput(true);
			con.setUseCaches(false);
			/* 设置传送的method=POST */
			con.setRequestMethod("POST");
			/* setRequestProperty */
			con.setRequestProperty("Connection", "Keep-Alive");
			con.setRequestProperty("Charset", "UTF-8");
			con.setRequestProperty("Content-Type",
					"multipart/form-data;boundary=" + boundary);

			/* 设置DataOutputStream */
			DataOutputStream ds = new DataOutputStream(con.getOutputStream());
			ds.writeBytes(twoHyphens + boundary + end);
			ds.writeBytes("Content-Disposition: form-data; "
					+ "name=\"GooddShip\";filename=\"" + uploadFile + "\"" + end);
			ds.writeBytes(end);

			/* 取得文件的FileInputStream */
			FileInputStream fStream = new FileInputStream(uploadFile);

			/* 设置每次写入1024bytes */
			int bufferSize = 1024;
			byte[] buffer = new byte[bufferSize];

			int length = -1;
			/* 从文件读取数据至缓冲区 */
			while ((length = fStream.read(buffer)) != -1) {
				/* 将资料写入DataOutputStream中 */
				ds.write(buffer, 0, length);
			}

			ds.writeBytes(end);
			ds.writeBytes(twoHyphens + boundary + twoHyphens + end);

			/* close streams */
			fStream.close();
			ds.flush();

			/* 取得Response内容 */
			InputStream is = con.getInputStream();
			int ch;
			StringBuffer b = new StringBuffer();
			while ((ch = is.read()) != -1) {
				b.append((char) ch);
			}
			
			/* Parse JSON */
			JSONObject jObject = new JSONObject(b.toString());
			int code = jObject.getInt("Code");
			String error = jObject.getString("Error");
			String msg = jObject.getString("msg");
			
			if (code == 1) {
			/* 将Response显示于Dialog */
				result = "上传成功";
			} else result = "上传失败" + error;
			/* 关闭DataOutputStream */
			ds.close();
		} catch (Exception e) {
			result = "上传失败" + e;
		}
	}

然后就可以了,我们最终的效果如下。


如果你有更好的方法,欢迎交流。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android Studio上上传图像到数据库需要进行以下步骤: 1.准备工作:将要上传的图像保存在本地,并获取到要上传的数据库URL、用户名、密码等信息。 2.创建一个上传图像的活动页面,包含一个ImageView和一个Button。 3.通过系统选择器或者自定义照相机等方式获取到要上传的图像,并将其显示在ImageView中。 4.编写上传图像的代码,使用HttpURLConnection或者OKHttp等网络请求库,将图像及相关信息POST或PUT到数据库中。 5.在上传完成后,可以显示一个上传成功的提示信息,并清空ImageView中的图像。 注意:在进行上传图像操作时,需要考虑到图像大小、格式、网络请求和权限等问题,以保证上传操作的顺利进行。 ### 回答2: Android Studio是Android开发的官方IDE工具,而上传图片到数据库是Android应用开发中常见的一项技术,下面就介绍Android Studio如何上传图片到数据库。 一.上传图片到服务器 在Android中上传图片时,需要先将图片上传到服务器,然后再将服务器返回的url地址保存到数据库中。可以使用第三方库Volley实现文件上传到服务器。 1.导入Volley库 在build.gradle文件中加入以下依赖库: ```gradle dependencies { ... implementation 'com.android.volley:volley:1.2.1' } ``` 2.编写上传图片代码Android中上传图片的方式有很多种,这里使用HttpURLConnection实现。步骤如下: 1)创建URL连接 ```java URL url = new URL(serverUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); ``` 2)设置连接属性 ```java conn.setDoInput(true);//允许输入 conn.setDoOutput(true);//允许输出 conn.setUseCaches(false);//不使用Cache conn.setRequestMethod("POST");//设置POST方式连接 ``` 3)设置请求头信息 ```java conn.setRequestProperty("Connection", "Keep-Alive");//维持长连接 conn.setRequestProperty("Charset", "UTF-8");//设置编码 conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); //设置 Content-Type 类型为 multipart/form-data ``` 4)设置写入数据的流 ```java DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"img\"; filename=\"" + filename + "\"" + lineEnd); dos.writeBytes(lineEnd);//如果不加这个会报错400 ``` 5)将图片写入输出流 ```java FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { dos.write(buffer, 0, len); } fis.close(); ``` 6)写入结束标志 ```java dos.writeBytes(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); dos.flush(); dos.close();//关闭连接 ``` 二.将url地址保存到数据库 上传成功后,服务器会返回图片的url地址,将此url地址存储到数据库中。 可以使用SQLiteOpenHelper来创建数据库和表,并使用ContentValues来操作数据库,示例代码如下: ```java //创建数据库和表 class MyDatabaseHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "my_database"; private static final String TABLE_NAME = "my_table"; private static final String COL_ID = "id"; private static final String COL_NAME = "name"; private static final String COL_URL = "url"; private static final String SQL_CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COL_NAME + " TEXT," + COL_URL + " TEXT)"; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(SQL_CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //数据库升级处理 } } //插入数据 private void insertData(String name, String url) { MyDatabaseHelper dbHelper = new MyDatabaseHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", name); values.put("url", url); long id = db.insert("my_table", null, values); db.close(); } ``` 综上所述,Android Studio上传图片到数据库需要先将图片上传到服务器,再将url地址存储到数据库中,具体实现可以使用Volley库实现文件上传,使用SQLiteOpenHelper实现数据库操作。 ### 回答3: Android Studio 是一款开发 Android 应用程序的集成开发环境(IDE)。在开发 Android 应用程序时,上传图片到数据库是一个常见的需求。本文将介绍如何使用 Android Studio 实现上传图片到数据库的功能。 在上传图片到数据库之前,需要先创建一个数据库以及一个带有图片字段的表。我们假设已经完成了这一步骤。 接下来,我们需要编写 Android 应用程序的代码。首先,需要添加以下依赖项到 build.gradle 文件中: ```java implementation 'com.squareup.okhttp3:okhttp:3.12.12' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.12.12' implementation 'com.squareup.okio:okio:1.15.0' ``` 这些依赖项将帮助我们使用 OkHttp 库来实现网络请求。 接下来,我们创建一个上传图片的方法,在这个方法中,将图片转换成 Base64 格式,然后将其作为一个字符串参数上传到服务器: ```java public void uploadImage(String imagePath) { String imageDataString = encodeImage(imagePath); OkHttpClient client = new OkHttpClient(); RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("image", imageDataString) .build(); Request request = new Request.Builder() .url("http://example.com/uploadimage") .post(requestBody) .build(); try { Response response = client.newCall(request).execute(); String responseString = response.body().string(); // Handle response } catch (IOException e) { e.printStackTrace(); } } private String encodeImage(String imagePath) { File imageFile = new File(imagePath); ByteArrayOutputStream baos = new ByteArrayOutputStream(); Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath()); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] b = baos.toByteArray(); String imageDataString = Base64.encodeToString(b, Base64.DEFAULT); return imageDataString; } ``` 在 uploadImage 方法中,我们首先将图片转换成 Base64 格式,然后使用 OkHttp 库来发送 POST 请求,将 Base64 字符串作为参数上传到服务器。 在服务器端,需要解码 Base64 字符串,并将其保存到数据库中。以下是一个 PHP 脚本,用于接收并处理来自 Android 应用程序的上传请求: ```php <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "database"; $conn = mysqli_connect($servername, $username, $password, $dbname); if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $imageData = base64_decode($_POST['image']); $sql = "INSERT INTO images (image) VALUES ('$imageData')"; if (mysqli_query($conn, $sql)) { echo "Image uploaded successfully"; } else { echo "Error: " . mysqli_error($conn); } mysqli_close($conn); ?> ``` 在这个 PHP 脚本中,我们首先获取来自 Android 应用程序的 Base64 字符串,并将其解码。然后,我们通过 INSERT INTO 语句将图片数据保存到数据库中。 以上就是如何使用 Android Studio 上传图片到数据库的全部过程。需要注意的是,这只是一个简单的示例,实际上,开发一个完整的图片上传应用程序需要处理很多细节和异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值