本文是继上一篇从相册中读取照片并显示的继续,并对代码兼容性做出了调整。
代码:
package cn.johnyu.day03;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class SelectPhotoActivity extends AppCompatActivity {
private ImageView photo;
private String uploadFileName;
private byte[] fileBuf;
private String uploadUrl = "http://172.20.10.3:8000/upload";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_photo);
photo = findViewById(R.id.photo);
}
//按钮点击事件
public void select(View view) {
String[] permissions = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
//进行sdcard的读写请求
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, permissions, 1);
} else {
openGallery(); //打开相册,进行选择
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openGallery();
} else {
Toast.makeText(this, "读相册的操作被拒绝", Toast.LENGTH_LONG).show();
}
}
}
//打开相册,进行照片的选择
private void openGallery() {
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 1:
handleSelect(data);
}
}
//选择后照片的读取工作
private void handleSelect(Intent intent) {
Cursor cursor = null;
Uri uri = intent.getData();
cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME);
uploadFileName = cursor.getString(columnIndex);
}
try {
InputStream inputStream = getContentResolver().openInputStream(uri);
fileBuf=convertToBytes(inputStream);
Bitmap bitmap = BitmapFactory.decodeByteArray(fileBuf, 0, fileBuf.length);
photo.setImageBitmap(bitmap);
} catch (Exception e) {
e.printStackTrace();
}
cursor.close();
}
//文件上传的处理
public void upload(View view) {
new Thread() {
@Override
public void run() {
OkHttpClient client = new OkHttpClient();
//上传文件域的请求体部分
RequestBody formBody = RequestBody
.create(fileBuf, MediaType.parse("image/jpeg"));
//整个上传的请求体部分(普通表单+文件上传域)
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("title", "Square Logo")
//filename:avatar,originname:abc.jpg
.addFormDataPart("avatar", uploadFileName, formBody)
.build();
Request request = new Request.Builder()
.url(uploadUrl)
.post(requestBody)
.build();
try {
Response response = client.newCall(request).execute();
Log.i("数据", response.body().string() + "....");
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
private byte[] convertToBytes(InputStream inputStream) throws Exception{
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len = inputStream.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.close();
inputStream.close();
return out.toByteArray();
}
}