android实现拍照及获取照片上传至接口
o
由于一些方法的弃用及版本权限的限制,被坑了好多错误。主要是Activity的区别。
布局展示:
Activity代码:
package tian.project.easytostop.activity;import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Dialog;
import android.content.ContentUris;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Toast;import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContract;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import tian.project.easytostop.MainActivity;
import tian.project.easytostop.R;/*** @author tian* @date 2022.6.17* @describe 拍照页面添加停车位的弹框显示活动**/
public class DialogActivity extends AppCompatActivity {private Integer choose=-1;//拍照private static final int TAKE_PHOTO = 1;//获取相册的图片private static final int CHOOSE_PHOTO = 2;private static final int ERROR_EXIT = -1;//uri对象private Uri imageUri;//获取照片private String imagePath = null;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//开启相机权限ActivityCompat.requestPermissions(DialogActivity.this,new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE},1);//需要回调时访问事件的方法-registerForActivityResult必须在生命周期STARTED之前调用ActivityResultLauncher<Intent> intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),result -> {System.out.println("回调数据" + result);//响应码int resultCode = result.getResultCode();System.out.println("选择码" + choose);//判断是否为拍摄图片if (resultCode == RESULT_OK) {switch (choose) {case TAKE_PHOTO: {//已拍摄System.out.println("已拍摄!");//上传照片upload();break;}case CHOOSE_PHOTO: {//获取相册System.out.println("已获取到照片!");// 判断手机系统版本号int version = Build.VERSION.SDK_INT;System.out.println("判断手机系统版本号" + version);File outputImage;try {// // 创建File对象,用于存储拍照后的图片outputImage = new File(getExternalCacheDir(), "output_image.jpg");System.out.println("------------------------01" + getExternalCacheDir());try {if (outputImage.exists()) {outputImage.delete();}outputImage.createNewFile();} catch (IOException e) {e.printStackTrace();}Uri uri = result.getData().getData();Bitmap imageBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),uri);System.out.println("获取imageBitmap"+imageBitmap);FileOutputStream fileOutputStream=new FileOutputStream(outputImage);imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);fileOutputStream.flush();fileOutputStream.close();Log.e("saveBitMap", "saveBitmap: 图片保存到" + getExternalCacheDir() +"/output_image.jpg");System.out.println("获取到相册后的图片路径为:"+imagePath);upload();} catch (IOException e) {e.printStackTrace();}
//break;}case ERROR_EXIT: {break;}}//判断是否为选择图片}});
// showBottomDialog();//1、使用Dialog、设置stylefinal Dialog dialog = new Dialog(this, R.style.DialogTheme);//2、设置布局View view = View.inflate(this, R.layout.dialog, null);dialog.setContentView(view);Window window = dialog.getWindow();//设置弹出位置window.setGravity(Gravity.BOTTOM);//设置弹出动画window.setWindowAnimations(R.style.main_menu_animStyle);//设置对话框大小window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);dialog.show();dialog.findViewById(R.id.tv_take_photo).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.d("DialogActivity", "onCreate: 实现拍摄!");dialog.dismiss();System.out.println("实现拍照的照片!");
// // 创建File对象,用于存储拍照后的图片File outputImage = new File(getExternalCacheDir(), "output_image.jpg");System.out.println("------------------------01" + getExternalCacheDir());try {if (outputImage.exists()) {outputImage.delete();}outputImage.createNewFile();} catch (IOException e) {e.printStackTrace();}System.out.println("SDK版本:" + Build.VERSION.SDK_INT);if (Build.VERSION.SDK_INT < 24) {imageUri = Uri.fromFile(outputImage);} else {imageUri = FileProvider.getUriForFile(DialogActivity.this, "tian.project.easytostop.fileprovider", outputImage);}
// // 启动相机程序System.out.println("获取照片路径:" + imageUri);System.out.println("获取照片路径:" + imageUri.getPath());
// Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
// intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
// startActivity(intent);
// //需要回调时访问事件的方法-registerForActivityResult必须在生命周期STARTED之前调用
// registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
// result -> {// Intent data=result.getData();
// System.out.println("回调数据"+data);
//
// })Intent intent = new Intent("android.media.action.IMAGE_CAPTURE").putExtra(MediaStore.EXTRA_OUTPUT, imageUri);choose=TAKE_PHOTO;intentActivityResultLauncher.launch( intent);}});dialog.findViewById(R.id.tv_take_pic).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.d("DialogActivity", "onCreate: 获取相册!");dialog.dismiss();if (ContextCompat.checkSelfPermission(DialogActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(DialogActivity.this, new String[]{ Manifest.permission. WRITE_EXTERNAL_STORAGE }, 1);} else {//打开相册System.out.println("打开相册");Intent intent = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);choose=CHOOSE_PHOTO;intentActivityResultLauncher.launch(intent);}}});dialog.findViewById(R.id.tv_cancel).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Log.d("DialogActivity", "onCreate:取消操作!");dialog.dismiss();Intent intent=new Intent(DialogActivity.this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);}});}/*** 上传照片*/public void upload() {new Thread(new Runnable() {@Overridepublic void run() {// if(choose==TAKE_PHOTO){imagePath="/storage/emulated/0/Android/data/tian.project.easytostop/cache/output_image.jpg";
// }Log.d("DialogActivity", "upload-run: 上传照片!");
// File file = new File("/storage/emulated/0/Android/data/tian.project.takepictures/cache/output_image.jpg");File file=new File(imagePath);System.out.println("测试返回结果imagePath:"+imagePath);MediaType mediaType=MediaType.Companion.parse("text/x-markdown; charset=utf-8");OkHttpClient okHttpClient = new OkHttpClient();RequestBody fileBody=RequestBody.Companion.create(file,mediaType);RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(),fileBody).build();String url = "http://119.23.176.137:9000/easy_to_stop/uploadFile/uploadImage";Request request = new Request.Builder().url(url).post(body).build();System.out.println(request);okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {System.out.println("上传失败!");}@Overridepublic void onResponse(Call call, Response response) throws IOException {String result = response.body().string();
// Gson gson = new GsonBuilder().create();
// System.out.println(gson);System.out.println("图片上传成功"+result);}});}}).start();}/*** todo 压缩图片* @param origin* @param ratio* @return*/public Bitmap scaleBitmap(Bitmap origin, float ratio) {if (origin == null) {return null;}int width = origin.getWidth();int height = origin.getHeight();Matrix matrix = new Matrix();matrix.preScale(ratio, ratio);Bitmap newBM = Bitmap.createBitmap(origin, 0, 0, width, height, matrix, false);return newBM;}
}
android实现拍照及获取照片上传至接口相关推荐
- Android实现拍照相册图片上传功能
更改头像功能不像修改信息一样直接提交参数就可以,需要上传图片文件 我就直接贴代码了首先给出布局文件 <ImageViewandroid:id="@+id/iv"android ...
- Unity Android通过拍照和相册上传头像(图片)
Unity点击按钮调用AS中显示对话框选择是从相册中上传还是拍照上传,如果是相册直接获得路径传给Unity使用,如果是拍照,先拍照保存在本地,再将路径传递给Unity使用 Android中提供了Int ...
- Android选择本地视频和照片上传到服务器
目录 照片photo: 将http//本地存放照片数据库电脑ip:端口号/fileaddress.png转image (一)后台发送来的数据转换Bitmap的方法: 用法: (二)将第一针显示出来方法 ...
- Android调取拍照和获取拍照后的照片
需要调取照相机拍照,但是又不想用第三方,自己去写的时候,却发现有很多坑.比如: 1.拍完照后,如何获取照片? 2.照片获取不到是什么原因? @ContentView(R.layout.activ ...
- Android实现批量照片上传至服务器,拍照或者从相册选择
最近由于项目需求,需要完成批量照片上传,折腾了一段时间,终于完成了,达到了如下效果 主界面主要有GridView组成和按钮组成,当按下一个格点时,会调用相机或者相册,拍照或者选择相册照片,选择完成之后 ...
- android照相及照片上传
android照相及照片上传 Java代码 package com.android.cist.camera.view; import java.io.ByteArrayOutputStream; ...
- Android实现拍照选择相册图片上传图片(多图片上传)功能
安卓多图片上传代码 直接上代码 1.主程序入口XML文件 <?xml version="1.0" encoding="utf-8"?> <ma ...
- android 图片拍照,Android获取图片拍照时间
为什么写这篇文章是因为今早有个需求需要获取图片拍照时的时间进行一些处理,有些方法参数名忘记了,所以谷歌百度了一下,Android 图片 时间,Android 图片 拍照 时间,这几个关键字居然无法搜索 ...
- 移动端照片上传、头像裁剪完整功能,兼容iphone,android (一)
第一步:照片上传 <input class="js_upFile" type="file" name="cover" accept=& ...
最新文章
- modlesim使用
- python互相转换组合_Python基本类型的连接组合和互相转换方式(13种)
- C++判断网络是否连接
- 配置错误:未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误信息为: 打不开 RSA 密钥容器。...
- openquery基本运用实例
- DataGrid动态绑定模板列
- 关于Django中JsonResponse返回中文字典编码错误的解决方案
- SpringBoot实战:整合Redis、mybatis,封装RedisUtils工具类等(附源码)
- 服务器宝塔怎么开启php5.4伪静态,WeCenter在宝塔面板LNMP环境下开启伪静态方法
- C#中英文字符串固定长度换行
- 银行票据+票据池相关的项目讲解
- php如何在微信公众号项目中,跳转到公众号关注页面
- #ASM 翻译系列第二十五弹:ASM 高级知识 When will my rebalance complete
- Hibernate学习文章
- python 百度云搜索引擎入口_2016最新百度云网盘搜索引擎源码,附带Python爬虫+PHP网站+Xunsearch搜索引擎...
- python中的标准输入设备_从MIDI设备获取输入(Python)
- 小学教育专业有计算机课程吗,小学教育专科是属于师范专业吗
- 一个未知的项目被声明为你的MXML文件的根。切换到源代码模式加以纠正。
- 实战中icon 的使用
- 企业人物的百度百科怎么建立的,创建百度百科词条要交费吗