前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android实现上传本地图片到网络功能

android实现上传本地图片到网络功能

作者头像
砸漏
发布2020-10-22 10:09:25
1.3K0
发布2020-10-22 10:09:25
举报
文章被收录于专栏:恩蓝脚本

本文实例为大家分享了android上传本地图片到网络的具体代码,供大家参考,具体内容如下

首先这里用到了Okhttp 所以需要一个依赖:

代码语言:javascript
复制
compile 'com.squareup.okhttp3:okhttp:3.9.0'

xml布局

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:app="http://schemas.android.com/apk/res-auto" 
  xmlns:tools="http://schemas.android.com/tools" 
  android:layout_width="match_parent" 
  android:orientation="vertical" 
  android:layout_height="match_parent" 
  tools:context="com.bwei.czx.czx10.MainActivity"  
 
  <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/photo"/  
 
 
  <Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/camear"/  
 
</LinearLayout  

AndroidManifest.xml中:权限

代码语言:javascript
复制
<uses-permission android:name="android.permission.INTERNET"/  
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/  
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/  

MainActivity中:

oncreat:

代码语言:javascript
复制
@Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    findViewById(R.id.photo).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
 
        toPhoto(); 
      } 
    }); 
 
 
    findViewById(R.id.camear).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
 
        toCamera(); 
      } 
    }); 
 
 
  } 

和oncreat同级的方法:

代码语言:javascript
复制
public void postFile(File file){ 
// sdcard/dliao/aaa.jpg 
String path = file.getAbsolutePath() ; 
String [] split = path.split("\\/"); 
MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); 
OkHttpClient client = new OkHttpClient(); 
RequestBody requestBody = new MultipartBody.Builder() 
.setType(MultipartBody.FORM) 
//        file 
.addFormDataPart("imageFileName",split[split.length-1]) 
.addFormDataPart("image",split[split.length-1],RequestBody.create(MEDIA_TYPE_PNG,file)) 
.build(); 
Request request = new Request.Builder().post(requestBody).url("http://qhb.2dyt.com/Bwei/upload").build(); 
client.newCall(request).enqueue(new Callback() { 
@Override 
public void onFailure(Call call, IOException e) { 
} 
@Override 
public void onResponse(Call call, Response response) throws IOException { 
System.out.println("response = " + response.body().string()); 
} 
}); 
} 
static final int INTENTFORCAMERA = 1 ; 
static final int INTENTFORPHOTO = 2 ; 
public String LocalPhotoName; 
public String createLocalPhotoName() { 
LocalPhotoName = System.currentTimeMillis() + "face.jpg"; 
return LocalPhotoName ; 
} 
public void toCamera(){ 
try { 
Intent intentNow = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
Uri uri = null ; 
//      if (Build.VERSION.SDK_INT  = Build.VERSION_CODES.N) { //针对Android7.0,需要通过FileProvider封装过的路径,提供给外部调用 
//        uri = FileProvider.getUriForFile(UploadPhotoActivity.this, "com.bw.dliao", SDCardUtils.getMyFaceFile(createLocalPhotoName()));//通过FileProvider创建一个content类型的Uri,进行封装 
//      }else { 
uri = Uri.fromFile(SDCardUtils.getMyFaceFile(createLocalPhotoName())) ; 
//      } 
intentNow.putExtra(MediaStore.EXTRA_OUTPUT, uri); 
startActivityForResult(intentNow, INTENTFORCAMERA); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
/** 
* 打开相册 
*/ 
public void toPhoto(){ 
try { 
createLocalPhotoName(); 
Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); 
getAlbum.setType("image/*"); 
startActivityForResult(getAlbum, INTENTFORPHOTO); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
super.onActivityResult(requestCode, resultCode, data); 
switch (requestCode) { 
case INTENTFORPHOTO: 
//相册 
try { 
// 必须这样处理,不然在4.4.2手机上会出问题 
Uri originalUri = data.getData(); 
File f = null; 
if (originalUri != null) { 
f = new File(SDCardUtils.photoCacheDir, LocalPhotoName); 
String[] proj = {MediaStore.Images.Media.DATA}; 
Cursor actualimagecursor = this.getContentResolver().query(originalUri, proj, null, null, null); 
if (null == actualimagecursor) { 
if (originalUri.toString().startsWith("file:")) { 
File file = new File(originalUri.toString().substring(7, originalUri.toString().length())); 
if(!file.exists()){ 
//地址包含中文编码的地址做utf-8编码 
originalUri = Uri.parse(URLDecoder.decode(originalUri.toString(),"UTF-8")); 
file = new File(originalUri.toString().substring(7, originalUri.toString().length())); 
} 
FileInputStream inputStream = new FileInputStream(file); 
FileOutputStream outputStream = new FileOutputStream(f); 
copyStream(inputStream, outputStream); 
} 
} else { 
// 系统图库 
int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
actualimagecursor.moveToFirst(); 
String img_path = actualimagecursor.getString(actual_image_column_index); 
if (img_path == null) { 
InputStream inputStream = this.getContentResolver().openInputStream(originalUri); 
FileOutputStream outputStream = new FileOutputStream(f); 
copyStream(inputStream, outputStream); 
} else { 
File file = new File(img_path); 
FileInputStream inputStream = new FileInputStream(file); 
FileOutputStream outputStream = new FileOutputStream(f); 
copyStream(inputStream, outputStream); 
} 
} 
Bitmap bitmap = ImageResizeUtils.resizeImage(f.getAbsolutePath(), 1080); 
int width = bitmap.getWidth(); 
int height = bitmap.getHeight(); 
FileOutputStream fos = new FileOutputStream(f.getAbsolutePath()); 
if (bitmap != null) { 
if (bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fos)) { 
fos.close(); 
fos.flush(); 
} 
if (!bitmap.isRecycled()) { 
bitmap.isRecycled(); 
} 
System.out.println("f = " + f.length()); 
postFile(f); 
} 
} 
} catch (Exception e) { 
e.printStackTrace(); 
} 
break; 
case INTENTFORCAMERA: 
//        相机 
try { 
//file 就是拍照完 得到的原始照片 
File file = new File(SDCardUtils.photoCacheDir, LocalPhotoName); 
Bitmap bitmap = ImageResizeUtils.resizeImage(file.getAbsolutePath(), 1080); 
int width = bitmap.getWidth(); 
int height = bitmap.getHeight(); 
FileOutputStream fos = new FileOutputStream(file.getAbsolutePath()); 
if (bitmap != null) { 
if (bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fos)) { 
fos.close(); 
fos.flush(); 
} 
if (!bitmap.isRecycled()) { 
//通知系统 回收bitmap 
bitmap.isRecycled(); 
} 
System.out.println("f = " + file.length()); 
postFile(file); 
} 
} catch (Exception e) { 
e.printStackTrace(); 
} 
break; 
} 
} 
public static void copyStream(InputStream inputStream, OutputStream outStream) throws Exception { 
try { 
byte[] buffer = new byte[1024]; 
int len = 0; 
while ((len = inputStream.read(buffer)) != -1) { 
outStream.write(buffer, 0, len); 
} 
outStream.flush(); 
} catch (IOException e) { 
e.printStackTrace(); 
}finally { 
if(inputStream != null){ 
inputStream.close(); 
} 
if(outStream != null){ 
outStream.close(); 
} 
} 
} 

ImageResizeUtils中:

代码语言:javascript
复制
package com.bwei.czx.czx10; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.media.ExifInterface; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import static android.graphics.BitmapFactory.decodeFile; 
/** 
* Created by czx on 2017/9/27. 
*/ 
public class ImageResizeUtils { 
/** 
* 照片路径 
* 压缩后 宽度的尺寸 
* @param path 
* @param specifiedWidth 
*/ 
public static Bitmap resizeImage(String path, int specifiedWidth) throws Exception { 
Bitmap bitmap = null; 
FileInputStream inStream = null; 
File f = new File(path); 
System.out.println(path); 
if (!f.exists()) { 
throw new FileNotFoundException(); 
} 
try { 
inStream = new FileInputStream(f); 
int degree = readPictureDegree(path); 
BitmapFactory.Options opt = new BitmapFactory.Options(); 
//照片不加载到内存 只能读取照片边框信息 
opt.inJustDecodeBounds = true; 
// 获取这个图片的宽和高 
decodeFile(path, opt); // 此时返回bm为空 
int inSampleSize = 1; 
final int width = opt.outWidth; 
//      width 照片的原始宽度 specifiedWidth 需要压缩的宽度 
//      1000 980 
if (width   specifiedWidth) { 
inSampleSize = (int) (width / (float) specifiedWidth); 
} 
// 按照 565 来采样 一个像素占用2个字节 
opt.inPreferredConfig = Bitmap.Config.RGB_565; 
//      图片加载到内存 
opt.inJustDecodeBounds = false; 
// 等比采样 
opt.inSampleSize = inSampleSize; 
//      opt.inPurgeable = true; 
// 容易导致内存溢出 
bitmap = BitmapFactory.decodeStream(inStream, null, opt); 
// bitmap = BitmapFactory.decodeFile(path, opt); 
if (inStream != null) { 
try { 
inStream.close(); 
} catch (IOException e) { 
e.printStackTrace(); 
} finally { 
inStream = null; 
} 
} 
if (bitmap == null) { 
return null; 
} 
Matrix m = new Matrix(); 
if (degree != 0) { 
//给Matrix 设置旋转的角度 
m.setRotate(degree); 
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); 
} 
float scaleValue = (float) specifiedWidth / bitmap.getWidth(); 
//      等比压缩 
m.setScale(scaleValue, scaleValue); 
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); 
return bitmap; 
} catch (OutOfMemoryError e) { 
e.printStackTrace(); 
return null; 
} catch (Exception e) { 
e.printStackTrace(); 
return null; 
} 
} 
/** 
* 读取图片属性:旋转的角度 
* 
* @param path 源信息 
*      图片绝对路径 
* @return degree旋转的角度 
*/ 
public static int readPictureDegree(String path) { 
int degree = 0; 
try { 
ExifInterface exifInterface = new ExifInterface(path); 
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 
switch (orientation) { 
case ExifInterface.ORIENTATION_ROTATE_90: 
degree = 90; 
break; 
case ExifInterface.ORIENTATION_ROTATE_180: 
degree = 180; 
break; 
case ExifInterface.ORIENTATION_ROTATE_270: 
degree = 270; 
break; 
} 
} catch (IOException e) { 
e.printStackTrace(); 
} 
return degree; 
} 
public static void copyStream(InputStream inputStream, OutputStream outStream) throws Exception { 
try { 
byte[] buffer = new byte[1024]; 
int len = 0; 
while ((len = inputStream.read(buffer)) != -1) { 
outStream.write(buffer, 0, len); 
} 
outStream.flush(); 
} catch (IOException e) { 
e.printStackTrace(); 
}finally { 
if(inputStream != null){ 
inputStream.close(); 
} 
if(outStream != null){ 
outStream.close(); 
} 
} 
} 
} 

SDcardutils中:

代码语言:javascript
复制
package com.bwei.czx.czx10; 
import android.os.Environment; 
import android.os.StatFs; 
import java.io.File; 
import java.io.IOException; 
/** 
* Created by czx on 2017/9/27. 
*/ 
public class SDCardUtils { 
public static final String DLIAO = "dliao" ; 
public static File photoCacheDir = SDCardUtils.createCacheDir(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + DLIAO); 
public static String cacheFileName = "myphototemp.jpg"; 
public static boolean isSDCardExist() { 
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
return true; 
} else { 
return false; 
} 
} 
public static void delFolder(String folderPath) { 
try { 
delAllFile(folderPath); 
String filePath = folderPath; 
filePath = filePath.toString(); 
File myFilePath = new File(filePath); 
myFilePath.delete(); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
public static boolean delAllFile(String path) { 
boolean flag = false; 
File file = new File(path); 
if (!file.exists()) { 
return flag; 
} 
if (!file.isDirectory()) { 
return flag; 
} 
String[] tempList = file.list(); 
File temp = null; 
for (int i = 0; i < tempList.length; i++) { 
if (path.endsWith(File.separator)) { 
temp = new File(path + tempList[i]); 
} else { 
temp = new File(path + File.separator + tempList[i]); 
} 
if (temp.isFile()) { 
temp.delete(); 
} 
if (temp.isDirectory()) { 
delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件 
delFolder(path + "/" + tempList[i]);// 再删除空文件夹 
flag = true; 
} 
} 
return flag; 
} 
public static boolean deleteOldAllFile(final String path) { 
try { 
new Thread(new Runnable() { 
@Override 
public void run() { 
delAllFile(Environment.getExternalStorageDirectory() + File.separator + DLIAO); 
} 
}).start(); 
} catch (Exception e) { 
e.printStackTrace(); 
return false; 
} 
return true; 
} 
/** 
* 给定字符串获取文件夹 
* 
* @param dirPath 
* @return 创建的文件夹的完整路径 
*/ 
public static File createCacheDir(String dirPath) { 
File dir = new File(dirPath);; 
if(isSDCardExist()){ 
if (!dir.exists()) { 
dir.mkdirs(); 
} 
} 
return dir; 
} 
public static File createNewFile(File dir, String fileName) { 
File f = new File(dir, fileName); 
try { 
// 出现过目录不存在的情况,重新创建 
if (!dir.exists()) { 
dir.mkdirs(); 
} 
f.createNewFile(); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
return f; 
} 
public static File getCacheFile() { 
return createNewFile(photoCacheDir, cacheFileName); 
} 
public static File getMyFaceFile(String fileName) { 
return createNewFile(photoCacheDir, fileName); 
} 
/** 
* 获取SDCARD剩余存储空间 
* 
* @return 0 sd已被挂载占用 1 sd卡内存不足 2 sd可用 
*/ 
public static int getAvailableExternalStorageSize() { 
if (isSDCardExist()) { 
File path = Environment.getExternalStorageDirectory(); 
StatFs stat = new StatFs(path.getPath()); 
long blockSize = stat.getBlockSize(); 
long availableBlocks = stat.getAvailableBlocks(); 
long memorySize = availableBlocks * blockSize; 
if(memorySize < 10*1024*1024){ 
return 1; 
}else{ 
return 2; 
} 
} else { 
return 0; 
} 
} 
} 

这样就可以上传图片到网络了!

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档