0


Android上传手机图片到服务器(这篇你要是看不懂,全网没你可以看懂的了!!!)

Android上传手机图片到服务器

在这里插入图片描述

1、整体流程

通过安卓app选取本地图片然后上传到服务器的整体流程步骤如下:
在这里插入图片描述

2、页面布局

样式

在这里插入图片描述
布局代码

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><ImageViewandroid:layout_width="200dp"android:layout_height="200dp"android:background="#555555"android:id="@+id/iv_image"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/xz"android:text="选择图片"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/sc"android:text="上传图片"/></LinearLayout>

id:iv_image用于呈现选择的图片
id:xz用于选择图片的按钮
id:sc用于上传的按钮

3、选择图片

流程

在这里插入图片描述
流程:点击“选择图片”在本机选取图片然后呈现到ImageView中(这个操作过程是不需要申请任何权限的)

实现

(1)获取“选择图片”按钮,并设置监听事件。

xz =(Button)findViewById(R.id.xz);//选择照片按钮
xz.setOnClickListener(this);//设置监听

(2)获取ImageView,便于之后呈现图片

iv_image =(ImageView)findViewById(R.id.iv_image);//展示图片按钮

(3)点击“选择图片”后操作,选取图片

点击事件

@OverridepublicvoidonClick(View view){switch(view.getId()){caseR.id.xz:xzImage();//选择图片break;}}

xzImage()函数进行图片选择

privatevoidxzImage(){Intent intent =newIntent("android.intent.action.GET_CONTENT");
        intent.setType("image/*");startActivityForResult(intent,CHOOSE_PHOTO);// 打开本地存储//CHOOSE_PHOTO:全局常量,标识}

CHOOSE_PHOTO:是一个全局常量,用于标识这是选择图片的这个操作,便于在回调函数中使用。

publicstaticfinalintCHOOSE_PHOTO=1;

(4)重写选择图片后的回调函数

当在手机上选择完图片后会回调onActivityResult函数,将一下“选择的信息”返回供用户操作。

requestCode:标识码
data:选择的图片的信息
data.getData()可以获取到图片的路径,但是是虚拟路径不是真实的存储路径,虚拟路径在ImageView组件中可以使用,但是如果通过虚拟路径进行创建文件(new File(“路径”))是不可能的。

@OverrideprotectedvoidonActivityResult(int requestCode,int resultCode,Intent data){super.onActivityResult(requestCode, resultCode, data);//requestCode:标识码//data:选择的图片的信息switch(requestCode){caseCHOOSE_PHOTO://显示图片
                iv_image.setImageURI(data.getData());//放在ImageView中呈现break;default:break;}}

以上操作全部是无需权限申请的

演示结果

在这里插入图片描述

完整代码

上述操作的完整代码

publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{privateButton xz;privateImageView iv_image;publicstaticfinalintCHOOSE_PHOTO=1;//标识选择图片@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//按钮
        xz =(Button)findViewById(R.id.xz);//选择照片按钮//图片
        iv_image =(ImageView)findViewById(R.id.iv_image);//展示图片//设置点击事件监听
        xz.setOnClickListener(this);}@OverridepublicvoidonClick(View view){switch(view.getId()){caseR.id.xz:xzImage();break;}}privatevoidxzImage(){Intent intent =newIntent("android.intent.action.GET_CONTENT");
        intent.setType("image/*");startActivityForResult(intent,CHOOSE_PHOTO);// 打开本地存储}@OverrideprotectedvoidonActivityResult(int requestCode,int resultCode,Intent data){super.onActivityResult(requestCode, resultCode, data);switch(requestCode){caseCHOOSE_PHOTO://判断是不是选择照片后的操作
                //显示图片
                iv_image.setImageURI(data.getData());break;default:break;}}}

4、路径转换

在这里插入图片描述

由于data.getData()获取到的是图片的虚拟路径,所以我们需要对路径进行路径转换,从虚拟路径真实路径的转换。(通过Utils.getRealPath(this, data)方法进行转换)

Utils.getRealPath(this, data)方法是封装的工具类

路径转换

在这里插入图片描述

Utils工具类

publicclassUtils{publicstaticStringgetRealPath(Context context,Intent data){// 判断手机系统版本号if(Build.VERSION.SDK_INT>=19){// 4.4及以上系统使用这个方法处理图片returnhandleImageOnKitKat(context,data);}else{// 4.4以下系统使用这个方法处理图片returnhandleImageBeforeKitKat(context,data);}}@TargetApi(19)privatestaticStringhandleImageOnKitKat(Context context,Intent data){String imagePath =null;Uri uri = data.getData();if(DocumentsContract.isDocumentUri(context, uri)){// 如果是document类型的Uri,则通过document id处理String docId =DocumentsContract.getDocumentId(uri);if("com.android.providers.media.documents".equals(uri.getAuthority())){String id = docId.split(":")[1];// 解析出数字格式的idString selection =MediaStore.Images.Media._ID +"="+ id;
                imagePath =getImagePath(context,MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);}elseif("com.android.providers.downloads.documents".equals(uri.getAuthority())){Uri contentUri =ContentUris.withAppendedId(Uri.parse("content://downloads/public downloads"),Long.valueOf(docId));
                imagePath =getImagePath(context,contentUri,null);}}elseif("content".equalsIgnoreCase(uri.getScheme())){// 如果是content类型的Uri,则使用普通方式处理
            imagePath =getImagePath(context,uri,null);}elseif("file".equalsIgnoreCase(uri.getScheme())){// 如果是file类型的Uri,直接获取图片路径即可
            imagePath = uri.getPath();}//displayImage(imagePath); // 根据图片路径显示图片return imagePath;}privatestaticStringhandleImageBeforeKitKat(Context context,Intent data){Uri uri = data.getData();String imagePath =getImagePath(context,uri,null);return imagePath;}@SuppressLint("Range")privatestaticStringgetImagePath(Context context,Uri uri,String selection){String path =null;// 通过Uri和selection来获取真实的图片路径Cursor cursor = context.getContentResolver().query(uri,null, selection,null,null);if(cursor !=null){if(cursor.moveToFirst()){
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));}
            cursor.close();}return path;}}

权限申请

由于在工具类中进行路径转换时候需要用到存储权限,所以我们在之前代码的基础上加上动态权限申请
在这里插入图片描述

注意:是在点击“选择图片”后进行权限申请,申请完后再去选择图片
顺序是这样子的:点击“选择图片按钮” == > 权限申请 ==》选择图片·

(1)在Manifest.xml中加入权限声明

<!--写--><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--读--><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>

(2)在onclick处加上权限检测、申请步骤

@OverridepublicvoidonClick(View view){switch(view.getId()){caseR.id.xz:if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this,newString[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},STORAGE_PERMISSION);}else{xzImage();}break;}}

Manifest.permission.WRITE_EXTERNAL_STORAGE既包括读权限又包括写权限,所以在Manifest.xml中才声明了两个
STORAGE_PERMISSION:是一个全局常量,用于标识申请的是什么权限,方便在权限的回调函数中使用。

publicstaticfinalintSTORAGE_PERMISSION=1;

(3)添加权限的回调函数

//选择权限后的回调函数@OverridepublicvoidonRequestPermissionsResult(int requestCode,@NonNullString[] permissions,@NonNullint[] grantResults){super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch(requestCode){caseSTORAGE_PERMISSION://检查是否有读取存储卡的权限,如果有则选择图片,如果没有则提示if(grantResults.length >0&& grantResults[0]==PackageManager.PERMISSION_GRANTED){xzImage();}else{Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT).show();}break;default:}}

STORAGE_PERMISSION:标识申请的是存储权限,是全局常量。
(4)测试
我们在onActivityResult中输出虚拟路径和真实路径看一下(如果不做上述的权限申请,则在调用Utils.getRealPath(this, data)方法进行路径转换时会报错)

//选择图片后的回调函数@OverrideprotectedvoidonActivityResult(int requestCode,int resultCode,Intent data){super.onActivityResult(requestCode, resultCode, data);switch(requestCode){caseCHOOSE_PHOTO://显示图片
                iv_image.setImageURI(data.getData());System.out.println("图片在手机上的虚拟路径为:"+data.getData());String realPath =Utils.getRealPath(this, data);System.out.println("图片在手机上的真实路径为:"+realPath);break;default:break;}}

申请权限
在这里插入图片描述

输出
在这里插入图片描述

完整代码

publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{privateButton xz;privateImageView iv_image;publicstaticfinalintCHOOSE_PHOTO=1;//标识选择图片publicstaticfinalintSTORAGE_PERMISSION=1;//标识权限申请@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//按钮
        xz =(Button)findViewById(R.id.xz);//选择照片按钮//图片
        iv_image =(ImageView)findViewById(R.id.iv_image);//展示图片//设置点击事件监听
        xz.setOnClickListener(this);}@OverridepublicvoidonClick(View view){switch(view.getId()){caseR.id.xz:if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this,newString[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},STORAGE_PERMISSION);}else{xzImage();}break;}}privatevoidxzImage(){Intent intent =newIntent("android.intent.action.GET_CONTENT");
        intent.setType("image/*");startActivityForResult(intent,CHOOSE_PHOTO);// 打开本地存储}//选择图片后的回调函数@OverrideprotectedvoidonActivityResult(int requestCode,int resultCode,Intent data){super.onActivityResult(requestCode, resultCode, data);switch(requestCode){caseCHOOSE_PHOTO://显示图片
                iv_image.setImageURI(data.getData());System.out.println("图片在手机上的虚拟路径为:"+data.getData());String realPath =Utils.getRealPath(this, data);System.out.println("图片在手机上的真实路径为:"+realPath);break;default:break;}}//选择权限后的回调函数@OverridepublicvoidonRequestPermissionsResult(int requestCode,@NonNullString[] permissions,@NonNullint[] grantResults){super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch(requestCode){caseSTORAGE_PERMISSION://检查是否有读取存储卡的权限,如果有则选择图片,如果没有则提示if(grantResults.length >0&& grantResults[0]==PackageManager.PERMISSION_GRANTED){xzImage();}else{Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT).show();}break;default:}}}

5、创建文件

在这里插入图片描述
当我们通过Utils.getRealPath(this, data)方法获取到真实的图片路径后就可以通过new File(路径的方式将图片封装成File对象了)

String realPath =Utils.getRealPath(this, data);
file =newFile(realPath);

这里的file是全局变量,便于后续上传的时候使用

privateFile file=null;

所以此时选择图片后的回调函数变为如下:

//选择图片后的回调函数@OverrideprotectedvoidonActivityResult(int requestCode,int resultCode,Intent data){super.onActivityResult(requestCode, resultCode, data);switch(requestCode){caseCHOOSE_PHOTO://显示图片
                iv_image.setImageURI(data.getData());//System.out.println("图片在手机上的虚拟路径为:"+data.getData());String realPath =Utils.getRealPath(this, data);
                file =newFile(realPath);//System.out.println("图片在手机上的真实路径为:"+realPath);break;default:break;}}

至此从相册选择图片到将图片创建成file对象已经全部完成。
这半部分全部完成
在这里插入图片描述

6、服务器端

为便于测试,该项目的服务器代码比较简单,通过一个接口接收文件(uploadfile),以及传过来的其余参数(name)。输出其余参数,并将图片存储到项目的当前目录下命名为a.jpg

@RestController@RequestMapping("/test")@CrossOriginpublicclassTestController{/**
     * 
     * @param uploadfile 接收文件
     * @param name 接收其余参数
     * @return
     * @throws IOException
     */@PostMapping("/upload")publicStringupload(MultipartFile uploadfile,String name)throwsIOException{//1、输出测试System.out.println("==============");System.out.println(uploadfile);System.out.println(name);System.out.println(uploadfile.getName());System.out.println(uploadfile.getSize());//2、将上传的图片存储到硬盘InputStream inputStream = uploadfile.getInputStream();FileChannel inChannel =(FileChannel)Channels.newChannel(inputStream);FileChannel outChannel =newFileOutputStream("./a.jpg").getChannel();//当前目录下,命名为a.jpg
        inChannel.transferTo(0,inChannel.size(),outChannel);//3、关闭流
        inChannel.close();
        outChannel.close();
        inputStream.close();//4、返回成功信息return"success";}}

(springboot项目)
目前为止服务器端的代码也以及全部搞定
在这里插入图片描述

7、传输

Android端的东西全部搞定,服务器端的东西也全部搞定,接下来就是通信了,也就是将文件从Android端传输到服务器端。
传输文件采用okhttp进行数据的传输
(1)权限申请
由于传输的时候使用到网络,所以在Manifest.xml中声明网络权限

<!--    网络--><uses-permissionandroid:name="android.permission.INTERNET"/>

并在Manifest.xml中加入这个,我们不采用https进行传输
在这里插入图片描述

(2)引入okhttp的依赖

//okhttp
    implementation 'com.squareup.okhttp3:okhttp:3.14.9'

在这里插入图片描述
刷新后便可以将okhttp的依赖加载到本地
(3)传输文件的工具类
通过okhttp封装成上传文件的工具类

publicclassHttpUtil{/**
     *
     * @param address  服务器地址
     * @param requestBody  请求体数据
     * @param callback  回调接口
     */publicstaticvoiduploadFile(String address,RequestBody requestBody ,okhttp3.Callback callback){//发送请求OkHttpClient client =newOkHttpClient.Builder().connectTimeout(60,TimeUnit.SECONDS)//设置连接超时时间.readTimeout(60,TimeUnit.SECONDS)//设置读取超时时间.build();Request request =newRequest.Builder().url(address).post(requestBody).build();
        client.newCall(request).enqueue(callback);}}

(4)上传函数

获取“上传按钮”并设置监听事件

sc =(Button)findViewById(R.id.sc);//上传按钮
sc.setOnClickListener(this);//上传

在点击事件中添加scImage()函数,在点击"上传图片"按钮后触发
onclick中
在这里插入图片描述

@OverridepublicvoidonClick(View view){switch(view.getId()){caseR.id.xz:if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this,newString[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},STORAGE_PERMISSION);}else{xzImage();}break;caseR.id.sc:scImage();break;}}

scImage()函数

privatevoidscImage(){//1、创建请求体RequestBody requestBody =newMultipartBody.Builder().setType(MultipartBody.FORM)//请求类型.addFormDataPart("name","lisi")//参数1.addFormDataPart("uploadfile","uploadfile",RequestBody.create(MediaType.parse("*/*"), file))// 第一个参数传到服务器的字段名,第二个你自己的文件名,第三个MediaType.parse("*/*")数据类型,这个是所有类型的意思,file就是我们之前创建的全局file,里面是创建的图片.build();//2、调用工具类上传图片以及参数HttpUtil.uploadFile("http://你的服务器IP:8080/test/upload", requestBody,newCallback(){//请求失败回调函数@OverridepublicvoidonFailure(Call call,IOException e){System.out.println("=============");System.out.println("异常::");
                e.printStackTrace();}//请求成功响应函数@OverridepublicvoidonResponse(Call call,Response response)throwsIOException{showResponse(response.body().string());//在主线程中显示提示框}});}

注意:安卓端的字段名要与服务器端接收的字段名字一样
在这里插入图片描述
在这里插入图片描述

由于在子线程不能操作ui,所以这里调用showResponse在主线程中提示,响应结果。

showResponse()

//ui操作,提示框privatevoidshowResponse(finalString response){runOnUiThread(newRunnable(){@Overridepublicvoidrun(){// 在这里进行UI操作,将结果显示到界面上Toast.makeText(MainActivity.this, response,Toast.LENGTH_SHORT).show();}});}

8、演示

至此已经完成了所有步骤“Android端”、“服务器端”、“传输数据”的代码编写。
我们将服务器端代码在服务器部署好,然后在Android端输入对应的ip,进行测试。

服务的“当前文件夹目录”
在这里插入图片描述
传输
在这里插入图片描述

传输完后
在这里插入图片描述
可以拉到本地打开看一下
在这里插入图片描述

9、完整代码

目录结构

在这里插入图片描述

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"><!--    网络--><uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"android:usesCleartextTraffic="true"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter><meta-dataandroid:name="android.app.lib_name"android:value=""/></activity></application></manifest>

布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><ImageViewandroid:layout_width="200dp"android:layout_height="200dp"android:background="#555555"android:id="@+id/iv_image"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/xz"android:text="选择图片"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/sc"android:text="上传图片"/></LinearLayout>

传输文件工具类HttpUtil

publicclassHttpUtil{/**
     *
     * @param address  服务器地址
     * @param requestBody  请求体数据
     * @param callback  回调接口
     */publicstaticvoiduploadFile(String address,RequestBody requestBody ,okhttp3.Callback callback){//发送请求OkHttpClient client =newOkHttpClient.Builder().connectTimeout(60,TimeUnit.SECONDS)//设置连接超时时间.readTimeout(60,TimeUnit.SECONDS)//设置读取超时时间.build();Request request =newRequest.Builder().url(address).post(requestBody).build();
        client.newCall(request).enqueue(callback);}}

路径转换工具类Utils

publicclassUtils{publicstaticStringgetRealPath(Context context,Intent data){// 判断手机系统版本号if(Build.VERSION.SDK_INT>=19){// 4.4及以上系统使用这个方法处理图片returnhandleImageOnKitKat(context,data);}else{// 4.4以下系统使用这个方法处理图片returnhandleImageBeforeKitKat(context,data);}}@TargetApi(19)privatestaticStringhandleImageOnKitKat(Context context,Intent data){String imagePath =null;Uri uri = data.getData();if(DocumentsContract.isDocumentUri(context, uri)){// 如果是document类型的Uri,则通过document id处理String docId =DocumentsContract.getDocumentId(uri);if("com.android.providers.media.documents".equals(uri.getAuthority())){String id = docId.split(":")[1];// 解析出数字格式的idString selection =MediaStore.Images.Media._ID +"="+ id;
                imagePath =getImagePath(context,MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);}elseif("com.android.providers.downloads.documents".equals(uri.getAuthority())){Uri contentUri =ContentUris.withAppendedId(Uri.parse("content://downloads/public downloads"),Long.valueOf(docId));
                imagePath =getImagePath(context,contentUri,null);}}elseif("content".equalsIgnoreCase(uri.getScheme())){// 如果是content类型的Uri,则使用普通方式处理
            imagePath =getImagePath(context,uri,null);}elseif("file".equalsIgnoreCase(uri.getScheme())){// 如果是file类型的Uri,直接获取图片路径即可
            imagePath = uri.getPath();}//displayImage(imagePath); // 根据图片路径显示图片return imagePath;}privatestaticStringhandleImageBeforeKitKat(Context context,Intent data){Uri uri = data.getData();String imagePath =getImagePath(context,uri,null);return imagePath;}@SuppressLint("Range")privatestaticStringgetImagePath(Context context,Uri uri,String selection){String path =null;// 通过Uri和selection来获取真实的图片路径Cursor cursor = context.getContentResolver().query(uri,null, selection,null,null);if(cursor !=null){if(cursor.moveToFirst()){
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));}
            cursor.close();}return path;}}

MainActivity类

publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{privateButton xz;privateButton sc;privateImageView iv_image;publicstaticfinalintCHOOSE_PHOTO=1;publicstaticfinalintSTORAGE_PERMISSION=1;privateFile file=null;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//按钮
        xz =(Button)findViewById(R.id.xz);//选择照片按钮
        sc =(Button)findViewById(R.id.sc);//上传按钮//图片
        iv_image =(ImageView)findViewById(R.id.iv_image);//展示图片//设置点击事件监听
        xz.setOnClickListener(this);//选择
        sc.setOnClickListener(this);//上传}@OverridepublicvoidonClick(View view){switch(view.getId()){caseR.id.xz:if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this,newString[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},STORAGE_PERMISSION);}else{xzImage();}break;caseR.id.sc:scImage();break;}}privatevoidxzImage(){Intent intent =newIntent("android.intent.action.GET_CONTENT");
        intent.setType("image/*");startActivityForResult(intent,CHOOSE_PHOTO);// 打开本地存储}privatevoidscImage(){RequestBody requestBody =newMultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("name","lisi").addFormDataPart("uploadfile","uploadfile",RequestBody.create(MediaType.parse("*/*"), file))// 第一个参数传到服务器的字段名,第二个你自己的文件名,第三个MediaType.parse("*/*")数据类型,这个是所有类型的意思,file就是我们之前创建的全局file,里面是创建的图片.build();HttpUtil.uploadFile("http://你自己的ip:8080/test/upload", requestBody,newCallback(){@OverridepublicvoidonFailure(Call call,IOException e){System.out.println("=============");System.out.println("异常::");
                e.printStackTrace();//Toast.makeText(MainActivity.this, "上传异常", Toast.LENGTH_SHORT).show();}@OverridepublicvoidonResponse(Call call,Response response)throwsIOException{showResponse(response.body().string());//Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_SHORT).show();}});}//选择图片后的回调函数@OverrideprotectedvoidonActivityResult(int requestCode,int resultCode,Intent data){super.onActivityResult(requestCode, resultCode, data);switch(requestCode){caseCHOOSE_PHOTO://显示图片
                iv_image.setImageURI(data.getData());//System.out.println("图片在手机上的虚拟路径为:"+data.getData());String realPath =Utils.getRealPath(this, data);
                file =newFile(realPath);//System.out.println("图片在手机上的真实路径为:"+realPath);break;default:break;}}//选择权限后的回调函数@OverridepublicvoidonRequestPermissionsResult(int requestCode,@NonNullString[] permissions,@NonNullint[] grantResults){super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch(requestCode){caseSTORAGE_PERMISSION:if(grantResults.length >0&& grantResults[0]==PackageManager.PERMISSION_GRANTED){xzImage();}else{Toast.makeText(this,"You denied the permission",Toast.LENGTH_SHORT).show();}break;default:}}//ui操作,提示框privatevoidshowResponse(finalString response){runOnUiThread(newRunnable(){@Overridepublicvoidrun(){// 在这里进行UI操作,将结果显示到界面上Toast.makeText(MainActivity.this, response,Toast.LENGTH_SHORT).show();}});}}

本文转载自: https://blog.csdn.net/baiqi123456/article/details/129327111
版权归原作者 齊 天 大 聖 所有, 如有侵权,请联系我们删除。

“Android上传手机图片到服务器(这篇你要是看不懂,全网没你可以看懂的了!!!)”的评论:

还没有评论