当前位置:   article > 正文

Android 选择与上传图片到服务器—OkHttp3_安卓选择多图后图片上传服务器okhttp

安卓选择多图后图片上传服务器okhttp

1.http 上传的工具 采用的是 okHttp3

  1. build.gradle --> dependencies 添加依赖
  2. /*请求 okhttps 依赖jar 添加上述依赖会自动添加两个库,一个是OkHttp,一个是Okio */
  3. implementation 'com.squareup.okhttp3:okhttp:4.0.1'

 

2.选择图片的 Intent 带参数 跳转:

  1. Intent i = new Intent(
  2. Intent.ACTION_PICK , MediaStore.Images.Media.EXTERNAL_CONTENT_URI
  3. );
  4. startActivityForResult(i, 2); // 2 表示选择之后的返回码,也叫返回识别码
  1. /**
  2. * 图片选择的回调方法
  3. */
  4. @Override
  5. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  6. super.onActivityResult(requestCode, resultCode, data);
  7. if (requestCode == 2) {
  8. // 从相册返回的数据
  9. if (data != null) {
  10. // 前端页面展示图片
  11. imageView.setImageURI( data.getData() );
  12. // 获取图片 文件 保存
  13. file = new File( uriChange.getSDPath( data.getData() , this) );
  14. // 发布图片到服务器中去
  15. MyAsyncTaskUtil myAsyncTaskUtil = new MyAsyncTaskUtil(1);
  16. myAsyncTaskUtil.execute( WebPathRes.PictureSubmit , 2 );
  17. } else {
  18. Toast.makeText(this, "图片选择失败", Toast.LENGTH_LONG).show();
  19. }
  20. }
  21. } // WebPathRes.PictureSubmit 表示提交的 url ,uriChange.getSDPath 表示获取本机的path

 

3.Android 6.0之后,同样 targetSdkVersion >= 22 之后,需要获取动态权限。

  1. /**
  2. * 存储权限
  3. */
  4. public void myRequetPermission( ) {
  5. if (ContextCompat.checkSelfPermission( IndexAddConversation.this , Manifest.permission.WRITE_EXTERNAL_STORAGE) != PERMISSION_GRANTED) {
  6. ActivityCompat.requestPermissions( IndexAddConversation.this , new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
  7. }else {
  8. Toast.makeText( IndexAddConversation.this ,"您已经申请了权限!",Toast.LENGTH_SHORT).show();
  9. }
  10. }
  11. @Override
  12. public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  13. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  14. if (requestCode == 1) {
  15. for (int i = 0; i < permissions.length; i++) {
  16. if (grantResults[i] == PERMISSION_GRANTED) {//选择了“始终允许”
  17. Toast.makeText(this, "" + "权限" + permissions[i] + "申请成功", Toast.LENGTH_SHORT).show();
  18. } else {
  19. if (!ActivityCompat.shouldShowRequestPermissionRationale(IndexAddConversation.this, permissions[i])){//用户选择了禁止不再询问
  20. AlertDialog.Builder builder = new AlertDialog.Builder( IndexAddConversation.this );
  21. builder.setTitle("permission")
  22. .setMessage("点击允许才可以使用我们的app哦")
  23. .setPositiveButton("去允许", new DialogInterface.OnClickListener() {
  24. public void onClick(DialogInterface dialog, int id) {
  25. if (mDialog != null && mDialog.isShowing()) {
  26. mDialog.dismiss();
  27. }
  28. Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  29. Uri uri = Uri.fromParts("package", getPackageName(), null);//注意就是"package",不用改成自己的包名
  30. intent.setData(uri);
  31. startActivityForResult(intent, NOT_NOTICE);
  32. }
  33. });
  34. mDialog = builder.create();
  35. mDialog.setCanceledOnTouchOutside(false);
  36. mDialog.show();
  37. }else {//选择禁止
  38. AlertDialog.Builder builder = new AlertDialog.Builder( IndexAddConversation.this);
  39. builder.setTitle("permission")
  40. .setMessage("点击允许才可以使用我们的app哦")
  41. .setPositiveButton("去允许", new DialogInterface.OnClickListener() {
  42. public void onClick(DialogInterface dialog, int id) {
  43. if (alertDialog != null && alertDialog.isShowing()) {
  44. alertDialog.dismiss();
  45. }
  46. ActivityCompat.requestPermissions( IndexAddConversation.this ,
  47. new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
  48. }
  49. });
  50. alertDialog = builder.create();
  51. alertDialog.setCanceledOnTouchOutside(false);
  52. alertDialog.show();
  53. }
  54. }
  55. }
  56. }
  57. }

4.上传图片操作:

  1. // 我的返回数据组成为 data,return_code mesg
  2. public Object httpsPostImgRequest( String url ){
  3. try {
  4. OkHttpClient okHttpClient = new OkHttpClient();
  5. RequestBody requestBody = new MultipartBody.Builder()
  6. .setType(MultipartBody.FORM)
  7. // 此处可添加上传 参数
  8. // photoFile 表示上传参数名,logo.png 表示图片名字
  9. .addFormDataPart("photoFile", "logo.png",
  10. RequestBody.create(MediaType.parse("multipart/form-data"), file))//文件
  11. .build();
  12. Request request = new Request.Builder()
  13. .url(url)
  14. .post(requestBody)
  15. .build();
  16. Response response = okHttpClient.newCall(request).execute();
  17. String requestData = response.body().string();
  18. // 信息打印 是否是服务器返回的数据 , 默认即便是空值,对象也存在值为""
  19. if (requestData.contains("data")){
  20. Log.d("returnInfo", " 口令:" + requestData);
  21. return requestData;
  22. }else{
  23. requestData = response.body().toString();
  24. Log.d( "returnInfo" , ""+ requestData );
  25. return requestData;
  26. }
  27. }catch (Exception e){
  28. e.printStackTrace();
  29. }
  30. return null;
  31. }

 

5 url 转换成为 path 

  1. import android.app.Activity;
  2. import android.content.Context;
  3. import android.database.Cursor;
  4. import android.net.Uri;
  5. import android.provider.MediaStore;
  6. /**
  7. * 本地 图片/文件/音频等等 获取的 uri 转换成为本地的 path 路径
  8. * @author zjw
  9. */
  10. public class UriChange {
  11. /**
  12. * Try to return the absolute file path from the given Uri
  13. */
  14. public String getRealFilePath(Context context , Uri uri ) {
  15. Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
  16. String path = null;
  17. if (cursor != null) {
  18. cursor.moveToFirst();
  19. String document_id = cursor.getString(0);
  20. document_id = document_id.substring(document_id.lastIndexOf(":") + 1);
  21. cursor.close();
  22. cursor = context.getContentResolver().query(
  23. android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
  24. null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
  25. if (cursor != null) {
  26. cursor.moveToFirst();
  27. path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
  28. cursor.close();
  29. }
  30. }
  31. return path;
  32. }
  33. /**
  34. * 获取上传文件图片的基地址
  35. */
  36. public String getSDPath( Uri uri , Activity activity) {
  37. String img_path = "";
  38. //如果是华为手机,调用上面给出的方法,即可得到正确的图片途径
  39. if( RomUtil.isEmui() ){
  40. img_path = getRealFilePath( activity , uri);
  41. }else{
  42. String[] proj = { MediaStore.Images.Media.DATA };
  43. Cursor actualimagecursor = activity.managedQuery(uri,proj,null,null,null);
  44. int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
  45. actualimagecursor.moveToFirst();
  46. img_path = actualimagecursor.getString(actual_image_column_index);
  47. }
  48. return img_path;
  49. }
  50. }

 

注: 其中 上传 操作,不能在主线程中操作,

所以 两个办法解决:

            1.线程 new Thread().start() 

            2.继承AsyncTask类,实现其中的方法

我采用的是 继承AsyncTask类 :只需要操作两个方法即可。

  1. doInBackground:用于返回结果
  2. onPostExecute:接收doInBackground的返回结果,用于更新UI

 

注:获取图片路径的时候,Intent 回调的 data,其实 是一个 url ,内容 类似:content://XXXXX/192等等

转成 path : 坑点1:不同手机 获取不一样。(主要是华为) 坑点二:url 转换成 path 的操作 需要区分对待

 

注:上面动态获取权限代码转自:https://blog.csdn.net/losingcarryjie/article/details/80889154 ,写得非常不错(代码全)

 

最后福利:来自一个封装好的 https 请求的 post 请求 函数(非上传文本操作的post情求):

  1. /**
  2. * 处理post的http或者https请求,返回数据
  3. */
  4. public Object httpsPostRequest( String url , Map<String , String> RequestInfo){
  5. if( url == null || url == "") return null;
  6. try {
  7. OkHttpClient okHttpClient = new OkHttpClient();
  8. // 消息追加
  9. FormBody.Builder builder = new FormBody.Builder();
  10. Set<String> keySet = RequestInfo.keySet();
  11. for(String key : keySet) {
  12. builder.add( key , RequestInfo.get( key ) );
  13. }
  14. RequestBody requestBody = builder.build();
  15. Request request = new Request.Builder()
  16. .url( url )
  17. .post( requestBody )
  18. .build();
  19. Response response = okHttpClient.newCall(request).execute();
  20. // string() 函数只可以操作一次,获取一次,否则会报错。
  21. return response.body().string();
  22. }catch (Exception e){
  23. e.printStackTrace();
  24. }
  25. return null;
  26. }

至于上面的 RomUtil.isEmui() 判断是否是华为手机,你们可以去百度啦,毕竟学习的路上太平坦了,也不好。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/530021
推荐阅读
相关标签
  

闽ICP备14008679号