1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android实现拍照相册图片上传功能

Android实现拍照相册图片上传功能

时间:2021-09-14 05:51:45

相关推荐

Android实现拍照相册图片上传功能

更改头像功能不像修改信息一样直接提交参数就可以,需要上传图片文件

我就直接贴代码了首先给出布局文件

<ImageViewandroid:id="@+id/iv"android:layout_width="50dp"android:layout_height="50dp"android:src="@mipmap/ic_launcher" /><Buttonandroid:id="@+id/btn1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="拍照" /><Buttonandroid:id="@+id/btn2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="摄像" /><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content" />

然后就是上传的代码了

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btn1, btn2;private ImageView headIv;private TextView textView;private static final String TAG = "MainActivity";private final int IMAGE_RESULT_CODE = 2;private final int PICK = 1;private String url = "";//此处为上传图片地址,我就不写了private String imgString = "";private Intent intent;private Handler mHandler = new Handler(Looper.getMainLooper());@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn1 = findViewById(R.id.btn1);btn2 = findViewById(R.id.btn2);textView = findViewById(R.id.tv);headIv = findViewById(R.id.iv);btn1.setOnClickListener(this);btn2.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn1:intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent, PICK);break;case R.id.btn2:intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, IMAGE_RESULT_CODE);break;}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {// 表示 调用照相机拍照case PICK:if (resultCode == RESULT_OK) {Bundle bundle = data.getExtras();Bitmap bitmap = (Bitmap) bundle.get("data");imgString = bitmapToBase64(bitmap);uploadImg();}break;// 选择图片库的图片case IMAGE_RESULT_CODE:if (resultCode == RESULT_OK) {Uri uri = data.getData();Bitmap bitmap2 = PhotoUtils.getBitmapFromUri(uri, this);imgString = bitmapToBase64(bitmap2);uploadImg();}break;}}//上传图片文件的操作public void uploadImg() {OkHttpClient okHttpClient = new OkHttpClient.Builder().build();//上传图片参数需要与服务端沟通,我就不多做解释了,我添加的都是我们服务端需要的//你们根据情况自行更改//另外网络请求我就不多做解释了FormBody body = new FormBody.Builder().add("dir", "c/image").add("data", imgString).add("file", "headicon").add("ext", "jpg").build();Request request = new Request.Builder().url(url).post(body).build();okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {final String data = response.body().string();Gson gson = new Gson();final Beans bean = gson.fromJson(data, Beans.class);Log.d(TAG, "onResponse: " + data);mHandler.post(new Runnable() {@Overridepublic void run() { //加载图片用的Gilde框架,也可以自己自由选择,//""里面取决于服务端的返回值是否需要自行添加地址Glide.with(MainActivity.this).load(""+bean.getData().getUrl()).into(headIv);}});}});}//如上参需要64位编码可调用此方法,不需要可以忽略public static String bitmapToBase64(Bitmap bitmap) {String result = null;ByteArrayOutputStream baos = null;try {if (bitmap != null) {baos = new ByteArrayOutputStream();press(pressFormat.JPEG, 100, baos);baos.flush();baos.close();byte[] bitmapBytes = baos.toByteArray();result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);}} catch (IOException e) {e.printStackTrace();} finally {try {if (baos != null) {baos.flush();baos.close();}} catch (IOException e) {e.printStackTrace();}}return result;}}

我尽量把说明都写在了注释里,就不在这里多说了

最后把照片工具类贴出来,因为MainActivity有调用

我不写出来可能有的小伙伴因为这一个报错就不知如何处理

实体类我就不写了,因为真的太简单了

public class PhotoUtils {private static final String TAG = "PhotoUtils";/*** @param activity 当前activity* @param imageUri 拍照后照片存储路径* @param requestCode 调用系统相机请求码*/public static void takePicture(Activity activity, Uri imageUri, int requestCode) {//调用系统相机Intent intentCamera = new Intent();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intentCamera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件}intentCamera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//将拍照结果保存至photo_file的Uri中,不保留在相册中intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);activity.startActivityForResult(intentCamera, requestCode);}/*** @param activity 当前activity* @param requestCode 打开相册的请求码*/public static void openPic(Activity activity, int requestCode) {Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);photoPickerIntent.setType("image/*");activity.startActivityForResult(photoPickerIntent, requestCode);}/*** @param activity 当前activity* @param orgUri剪裁原图的Uri* @param desUri剪裁后的图片的Uri* @param aspectXX方向的比例* @param aspectYY方向的比例* @param width 剪裁图片的宽度* @param height剪裁图片高度* @param requestCode 剪裁图片的请求码*/public static void cropImageUri(Activity activity, Uri orgUri, Uri desUri, int aspectX, int aspectY, int width, int height, int requestCode) {Intent intent = new Intent("com.android.camera.action.CROP");if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);}intent.setDataAndType(orgUri, "image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", aspectX);intent.putExtra("aspectY", aspectY);intent.putExtra("outputX", width);intent.putExtra("outputY", height);intent.putExtra("scale", true);//将剪切的图片保存到目标Uri中intent.putExtra(MediaStore.EXTRA_OUTPUT, desUri);intent.putExtra("return-data", false);intent.putExtra("outputFormat", pressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true);activity.startActivityForResult(intent, requestCode);}/*** 读取uri所在的图片** @param uri图片对应的Uri* @param mContext 上下文对象* @return 获取图像的Bitmap*/public static Bitmap getBitmapFromUri(Uri uri, Context mContext) {try {Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);return bitmap;} catch (Exception e) {e.printStackTrace();return null;}}/*** @param context 上下文对象* @param uri当前相册照片的Uri* @return 解析后的Uri对应的String*/@SuppressLint("NewApi")public static String getPath(final Context context, final Uri uri) {final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;String pathHead = "file:///";// DocumentProviderif (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {// ExternalStorageProviderif (isExternalStorageDocument(uri)) {final String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];if ("primary".equalsIgnoreCase(type)) {return pathHead + Environment.getExternalStorageDirectory() + "/" + split[1];}}// DownloadsProviderelse if (isDownloadsDocument(uri)) {final String id = DocumentsContract.getDocumentId(uri);final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));return pathHead + getDataColumn(context, contentUri, null, null);}// MediaProviderelse if (isMediaDocument(uri)) {final String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];Uri contentUri = null;if ("image".equals(type)) {contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;} else if ("video".equals(type)) {contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;} else if ("audio".equals(type)) {contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;}final String selection = "_id=?";final String[] selectionArgs = new String[]{split[1]};return pathHead + getDataColumn(context, contentUri, selection, selectionArgs);}}// MediaStore (and general)else if ("content".equalsIgnoreCase(uri.getScheme())) {return pathHead + getDataColumn(context, uri, null, null);}// Fileelse if ("file".equalsIgnoreCase(uri.getScheme())) {return pathHead + uri.getPath();}return null;}/*** Get the value of the data column for this Uri. This is useful for* MediaStore Uris, and other file-based ContentProviders.** @param context The context.* @param uri The Uri to query.* @param selection(Optional) Filter used in the query.* @param selectionArgs (Optional) Selection arguments used in the query.* @return The value of the _data column, which is typically a file path.*/private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {Cursor cursor = null;final String column = "_data";final String[] projection = {column};try {cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);if (cursor != null && cursor.moveToFirst()) {final int column_index = cursor.getColumnIndexOrThrow(column);return cursor.getString(column_index);}} finally {if (cursor != null)cursor.close();}return null;}/*** @param uri The Uri to check.* @return Whether the Uri authority is ExternalStorageProvider.*/private static boolean isExternalStorageDocument(Uri uri) {return "com.android.externalstorage.documents".equals(uri.getAuthority());}/*** @param uri The Uri to check.* @return Whether the Uri authority is DownloadsProvider.*/private static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}/*** @param uri The Uri to check.* @return Whether the Uri authority is MediaProvider.*/private static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。