1.点击上传获取本地文件:
Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT); photoPickerIntent.setType("application/*"); startActivityForResult(photoPickerIntent, 1);
2.获取本地文件回调得到文件地址:
@Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); try { if (data == null) { return; } if (requestCode == 1) { Uri url = data.getData(); // iv_file_lujing.setImageResource(R.mipmap.img_icon); Log.e("url======", "" + url); String path = FileUtils.getFilePathByUri(getContext(), url); Log.e("path======", "" + path); if (path == null || path.equals("")) { } else { File file = new File(path); Log.e("file======", "" + file); shangchuanTouxiang(file); } } } catch (Exception e) { Log.i("TAG", "MyBaseDataActivity--onActivityResult--error:" + e.toString()); } }
3.请求上传接口:
//上传文件接口 public void shangchuanTouxiang(File url) { if (orderId.equals("")) { Toast.makeText(getActivity(), "商品ID为空", Toast.LENGTH_SHORT).show(); return; } try { Log.i("TAG", "MyBaseDataActivity--shangchuanTouxiang--getPath:" + url.getPath()); userId = sp.getString("userId", ""); // 创建 RequestBody,用于封装构建RequestBody RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpeg"), url); // MultipartBody.Part 和后端约定好Key,这里的partName是用image MultipartBody.Part body = MultipartBody.Part.createFormData("file", url.getName(), requestFile); RetrfitUtils.getRetrfitManager() .requestPushMyFile(body, userId, orderId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<SendFile>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(SendFile sendFile) { Log.e("TAG", "修改=上传文件 onNext" + sendFile.getData() + "-" + sendFile.getMsg()); if (sendFile.getCode().equals("200")) { imgData = sendFile.getData(); Toast.makeText(getActivity(), sendFile.getMsg(), Toast.LENGTH_LONG).show(); } else { Toast.makeText(getActivity(), sendFile.getMsg(), Toast.LENGTH_LONG).show(); } } @Override public void onError(Throwable e) { Log.d("TAG", "修改=上传文件 onError: " + e.getMessage()); Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_LONG).show(); } @Override public void onComplete() { } }); } catch (Exception e) { Log.i("TAG", "MyBaseDataActivity--shangchuanTouxiang--error:" + e.toString()); } }
4.文件工具类:
import android.content.ContentResolver; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; //获取文件工具类 public final class FileUtils { public static String getFilePathByUri(Context context, Uri uri) { String path = ""; // 以 file:// 开头的 if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { path = uri.getPath(); return path; } // 以 content:// 开头的,比如 content://media/extenral/images/media/17766 if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) && Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null); if (cursor != null) { if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); if (columnIndex > -1) { path = cursor.getString(columnIndex); } } cursor.close(); } return path; } // 4.4及之后的 是以 content:// 开头的,比如 content://com.android.providers.media.documents/document/image%3A235700 if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (DocumentsContract.isDocumentUri(context, uri)) { if (isExternalStorageDocument(uri)) { // ExternalStorageProvider final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { path = Environment.getExternalStorageDirectory() + "/" + split[1]; return path; } } else if (isDownloadsDocument(uri)) { // DownloadsProvider final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); path = getDataColumn(context, contentUri, null, null); return path; } else if (isMediaDocument(uri)) { // MediaProvider 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]}; path = getDataColumn(context, contentUri, selection, selectionArgs); return path; } } } return null; } private 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 column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if (cursor != null) cursor.close(); } return null; } private static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } private static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } private static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } //=============================文件保存图片 public static Bitmap returnBitMap(final String url) { final Bitmap[] bitmap = {null}; new Thread(new Runnable() { @Override public void run() { URL imageurl = null; try { imageurl = new URL(url); } catch (MalformedURLException e) { e.printStackTrace(); } try { HttpURLConnection conn = (HttpURLConnection) imageurl.openConnection(); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); bitmap[0] = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); } } }).start(); return bitmap[0]; } }