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

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

xml布局

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
   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中:权限

?
1
2
3
< 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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@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同级的方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
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中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
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中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值