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