Android 图片上传

来源:互联网 发布:手机淘宝评价管理哪儿 编辑:程序博客网 时间:2024/06/16 03:06

一、获取相册图片路径:

因为Android4.4以上和4.3以下返回来的uri是不同的,得要通过以下这个类获取图片的路径:

public class StringPath {// android 4.4以上的public static String getPath(final Context context, final Uri uri) {final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;// DocumentProviderif (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {// ExternalStorageProviderif (isExternalStorageDocument(uri)) {final String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];if ("primary".equalsIgnoreCase(type)) {return Environment.getExternalStorageDirectory() + "/"+ split[1];}// TODO handle non-primary volumes}// DownloadsProviderelse if (isDownloadsDocument(uri)) {final String id = DocumentsContract.getDocumentId(uri);final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(id));return getDataColumn(context, contentUri, null, null);}// MediaProviderelse if (isMediaDocument(uri)) {final String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];Uri contentUri = null;if ("image".equals(type)) {contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;} else if ("video".equals(type)) {contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;} else if ("audio".equals(type)) {contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;}final String selection = "_id=?";final String[] selectionArgs = new String[] { split[1] };return getDataColumn(context, contentUri, selection,selectionArgs);}}// MediaStore (and general)else if ("content".equalsIgnoreCase(uri.getScheme())) {// Return the remote addressif (isGooglePhotosUri(uri))return uri.getLastPathSegment();return getDataColumn(context, uri, null, null);}// Fileelse if ("file".equalsIgnoreCase(uri.getScheme())) {return uri.getPath();}return null;}/** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. *  * @param context *            The context. * @param uri *            The Uri to query. * @param selection *            (Optional) Filter used in the query. * @param selectionArgs *            (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */public static String getDataColumn(Context context, Uri uri,String selection, String[] selectionArgs) {Cursor cursor = null;final String column = "_data";final String[] projection = { column };try {cursor = context.getContentResolver().query(uri, projection,selection, selectionArgs, null);if (cursor != null && cursor.moveToFirst()) {final int index = cursor.getColumnIndexOrThrow(column);return cursor.getString(index);}} finally {if (cursor != null)cursor.close();}return null;}/** * @param uri *            The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */public static boolean isExternalStorageDocument(Uri uri) {return "com.android.externalstorage.documents".equals(uri.getAuthority());}/** * @param uri *            The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */public static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}/** * @param uri *            The Uri to check. * @return Whether the Uri authority is MediaProvider. */public static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}/** * @param uri *            The Uri to check. * @return Whether the Uri authority is Google Photos. */public static boolean isGooglePhotosUri(Uri uri) {return "com.google.android.apps.photos.content".equals(uri.getAuthority());}// android 4.4以下public static String selectImage(Context context, Intent data) {Uri selectedImage = data.getData();if (selectedImage != null) {String uriStr = selectedImage.toString();String path = uriStr.substring(10, uriStr.length());if (path.startsWith("com.sec.android.gallery3d")) {Log.e("TAG","It's auto backup pic path:" + selectedImage.toString());return null;}}String[] filePathColumn = { MediaStore.Images.Media.DATA };Cursor cursor = context.getContentResolver().query(selectedImage,filePathColumn, null, null, null);cursor.moveToFirst();int columnIndex = cursor.getColumnIndex(filePathColumn[0]);String picturePath = cursor.getString(columnIndex);cursor.close();return picturePath;}}
二、通过相册获取图片:

mButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {Intent intent = new Intent(Intent.ACTION_GET_CONTENT);// ACTION_OPEN_DOCUMENTintent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/jpeg");if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {/** 4.4系统以上 **/startActivityForResult(intent, 0);} else {startActivityForResult(intent, 1);}}});
三、重写onActivityResult方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);StringPath stringPath = new StringPath();switch (requestCode) {case 0:Uri uri = data.getData();boolean f = DocumentsContract.isDocumentUri(MainActivity.this, uri);if (f == true) {final String string = stringPath.getPath(this, uri);Log.e("string", string);// mImageView.setImageBitmap(getBitmap(string));new MyTask().execute(string);} else {String string = stringPath.selectImage(this, data);Log.e("string", string);mImageView.setImageBitmap(getBitmap(string));}break;case 1:String string = stringPath.selectImage(this, data);Log.e("string", string);mImageView.setImageBitmap(getBitmap(string));break;default:break;}}

四、图片上传方法:

private String uploadFile(String srcPath) {String uploadUrl = "上传图片接口";String end = "\r\n";String twoHyphens = "--";String boundary = "******";try {URL url = new URL(uploadUrl);HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();httpURLConnection.setDoInput(true);httpURLConnection.setDoOutput(true);httpURLConnection.setUseCaches(false);httpURLConnection.setRequestMethod("POST");httpURLConnection.setRequestProperty("Connection", "Keep-Alive");httpURLConnection.setRequestProperty("Charset", "UTF-8");httpURLConnection.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());dos.writeBytes(twoHyphens + boundary + end);dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""+ srcPath.substring(srcPath.lastIndexOf("/") + 1)+ "\""+ end);dos.writeBytes(end);FileInputStream fis = new FileInputStream(srcPath);byte[] buffer = new byte[8192]; // 8kint count = 0;while ((count = fis.read(buffer)) != -1) {dos.write(buffer, 0, count);}fis.close();dos.writeBytes(end);dos.writeBytes(twoHyphens + boundary + twoHyphens + end);dos.flush();InputStream is = httpURLConnection.getInputStream();InputStreamReader isr = new InputStreamReader(is, "utf-8");BufferedReader br = new BufferedReader(isr);String result = br.readLine();dos.close();is.close();return result;} catch (Exception e) {e.printStackTrace();setTitle(e.getMessage());}return null;}

五、当我直接用这个方法上传的时候,太耗时了,得用异步可成功运行project呀:

class MyTask extends AsyncTask<String, Void, String> {@Overrideprotected String doInBackground(String... params) {// TODO Auto-generated method stubreturn uploadFile(params[0]);}@Overrideprotected void onPostExecute(String result) {// TODO Auto-generated method stubsuper.onPostExecute(result);System.out.println(result);}

六、运行如下:


七、Demo下载链接:

点击打开链接


0 0
原创粉丝点击