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

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

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

compile 'com.squareup.okhttp3:okhttp:3.9.0'

xml布局

<?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中:权限

<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:

@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同级的方法:

 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中:

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中:

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;
    }
  }
}

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

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

(0)

相关推荐

  • Android开发中调用系统相册上传图片到服务器OPPO等部分手机上出现短暂的显示桌面问题的解决方法

    要原因是主体样式设置的问题:这里把appTheme设置一个style即可: <item name="android:windowBackground">@color/white</item> <!--下面这个属性很重要,有时候会出现某些机型在调用系统相册的时候,短暂的出现手机桌面现象--> <item name="android:windowIsTranslucent">false</item> <i

  • Android实现本地上传图片并设置为圆形头像

    先从本地把图片上传到服务器,然后根据URL把头像处理成圆形头像. 因为上传图片用到bmob的平台,所以要到bmob(http://www.bmob.cn)申请密钥. 效果图: 核心代码: 复制代码 代码如下: public class MainActivity extends Activity {         private ImageView iv;         private String appKey="";                //填写你的Applicatio

  • 解决android有的手机拍照后上传图片被旋转的问题

    需求:做仿新浪发微博的项目,能够上传图片还有两外一个项目用到手机拍摄图片,这两个都需要把图片上传到服务器 遇到问题:有的手机拍摄的图片旋转90度,有的图片旋转了180度,有的手机是正常的,服务器要求的是正的,这样问题就来了,不能用户发个照片在微博上看到的是被旋转了的啊,另外一个项目里旋转了的图片直接匹配出现问题,这个更严重. 解决:开始的时候在网上没有找到很好的解决办法,谷歌百度的搜了一通,想到第一种解决方式,当手机拍照结束,在返回结果处理里面立即跳转到一个新的页面,在新的页面里让用户自己手动去

  • Android Retrofit 2.0框架上传图片解决方案

    本文为大家分享了 Android Retrofit 2.0框架上传图片解决方案,具体内容如下 1.单张图片的上传 /** * 上传一张图片 * @param description * @param imgs * @return */ @Multipart @POST("/upload") Call<String> uploadImage(@Part("fileName") String description, @Part("file\&qu

  • Android 开发 使用WebUploader解决安卓微信浏览器上传图片中遇到的bug

    先给大家分析下微信浏览器上传图片bug的原因 微信在新版本中采用的是自己的X5内核浏览器,而在较老的版本中还有可能是安卓的原生浏览器.具体的环境我也不太了解,但是经过实际多台安卓机型的测试,我采取的方案可以基本确保在安卓机中微信浏览器的成功上传.苹果机型没问题,因为微信的ios客户端使用的是Safari的内核,没有各种坑,且效果最好. 这里给出一个 WebUploader 官方关于移动端适配的 issues 链接.里面提供的方法确实有效,但就是解决的方案并没有很清楚的展示出来,从该issues中

  • android上传图片到PHP的过程详解

    今天在做上传头像的时候,总是提交连接超时错误,报错信息如下:XXXXXXSokcetTimeOutXXXXXXXX 然后自己设置HTTP的超时时间: 复制代码 代码如下: [java] view plaincopyprint? //设置超时时间  httpclient.setTimeout(20000); 再building,runing,还是不行....这就怪了,明明好好的,怎么会突然就变成连接超时了呢!又折腾了一阵子后,也跟后台那边的朋友沟通过,他也测试了上传接口,发现没什么问题,就让我自己

  • Android异步上传图片到PHP服务器

    原理 Android客户端模拟一个HTTP的Post请求到服务器端,服务器端接收相应的Post请求后,返回响应信息给给客户端. 背景 网上很多上传到java服务器上的,找了好久,找到了上传到php的了,思路跟我当初想的差不多,就是POST过去.废话不多说,直接上图看代码. php代码 <?php $target_path = "./upload/";//接收文件目录 $target_path = $target_path . basename( $_FILES['uploaded

  • Android使用OkHttp上传图片的实例代码

    简介 上传图片是一个APP的常见功能,可以是通过OOS上传到阿里云,也可以直接上传到Server后台,OOS有提供相应的SDK,此处忽略.下面通过OkHttp来实现图片的上传 代码 直接上代码UploadFileHelper.kt object UploadFileHelper { //--------ContentType private val MEDIA_OBJECT_STREAM = MediaType.parse("multipart/form-data") //------

  • Android 通过Base64上传图片到服务器实现实例

    Android 通过Base64上传图片到服务器 之前做上传图片是采用HttpServlet上传,不过用了一下Base64上传图片后,感觉比HttpServlet方便很多,大家也可以跟着尝试一下. 前台图片处理:(传Bitmap对象即可) /** * 通过Base32将Bitmap转换成Base64字符串 * @param bit * @return */ public String Bitmap2StrByBase64(Bitmap bit){ ByteArrayOutputStream bo

  • Android使用post方式上传图片到服务器的方法

    本文实例讲述了Android使用post方式上传图片到服务器的方法.分享给大家供大家参考,具体如下: /** * 上传文件到服务器类 * * @author tom */ public class UploadUtil { private static final String TAG = "uploadFile"; private static final int TIME_OUT = 10 * 1000; // 超时时间 private static final String CH

随机推荐