10拍照上传 Android android拍照上传到服务器

您所在的位置:网站首页 安卓图片上传到服务器 10拍照上传 Android android拍照上传到服务器

10拍照上传 Android android拍照上传到服务器

2024-07-11 06:13| 来源: 网络整理| 查看: 265

这篇教程主要介绍如何使用摄像头还有相册,还介绍如何将获取到的照片上传至服务器保存(这里主要是用到了阿里云的对象存储OSS服务) 应用场景:APP中“我的”界面或者“个人中心”界面,个人头像选择及存储问题!

一、前端创建Android项目1、布局文件

10拍照上传 Android android拍照上传到服务器_xml

2、AndroidManifest.xml申请权限

android:requestLegacyExternalStorage=“true”:targetSdkVersion30就加上这句话,还有网络权限,还需要在配置一下android:networkSecurityConfig="@xml/network_security_config"network_security_config.xml

10拍照上传 Android android拍照上传到服务器_10拍照上传 Android_02

3、Avatarupload.javapublic class Avatarupload extends AppCompatActivity { public static final int TAKE_PHOTO = 1; public static final int CHOOSE_PHOTO = 2; private ImageView picture; private Button takePhoto; private Button chooseFromAlbum; private Uri imageUri; private String imagePath = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_avatarupload); takePhoto = (Button) findViewById(R.id.take_photo); chooseFromAlbum = (Button) findViewById(R.id.choose_from_album); picture = (ImageView) findViewById(R.id.picture); takePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 创建File对象,用于存储拍照后的图片 File outputImage = new File(getExternalCacheDir(), "output_image.jpg"); try { if (outputImage.exists()) { outputImage.delete(); } outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } if (Build.VERSION.SDK_INT < 24) { imageUri = Uri.fromFile(outputImage); } else { imageUri = FileProvider.getUriForFile(Avatarupload.this, "com.example.cameraalbumtest.fileprovider", outputImage); } // 启动相机程序 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, TAKE_PHOTO); } }); chooseFromAlbum.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ContextCompat.checkSelfPermission(Avatarupload.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(Avatarupload.this, new String[]{ Manifest.permission. WRITE_EXTERNAL_STORAGE }, 1); } else { openAlbum(); } } }); } private void openAlbum() { Intent intent = new Intent("android.intent.action.GET_CONTENT"); intent.setType("image/*"); startActivityForResult(intent, CHOOSE_PHOTO); // 打开相册 } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 1: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { openAlbum(); } else { Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show(); } break; default: } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case TAKE_PHOTO: if (resultCode == RESULT_OK) { try { // 将拍摄的照片显示出来 Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); picture.setImageBitmap(bitmap); } catch (Exception e) { e.printStackTrace(); } } break; case CHOOSE_PHOTO: if (resultCode == RESULT_OK) { // 判断手机系统版本号 if (Build.VERSION.SDK_INT >= 19) { // 4.4及以上系统使用这个方法处理图片 handleImageOnKitKat(data); } else { // 4.4以下系统使用这个方法处理图片 handleImageBeforeKitKat(data); } } break; default: break; } } @TargetApi(19) private void handleImageOnKitKat(Intent data) { Uri uri = data.getData(); Log.d("TAG", "handleImageOnKitKat: uri is " + uri); if (DocumentsContract.isDocumentUri(this, uri)) { // 如果是document类型的Uri,则通过document id处理 String docId = DocumentsContract.getDocumentId(uri); if("com.android.providers.media.documents".equals(uri.getAuthority())) { String id = docId.split(":")[1]; // 解析出数字格式的id String selection = MediaStore.Images.Media._ID + "=" + id; imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection); } else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) { Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId)); imagePath = getImagePath(contentUri, null); } } else if ("content".equalsIgnoreCase(uri.getScheme())) { // 如果是content类型的Uri,则使用普通方式处理 imagePath = getImagePath(uri, null); } else if ("file".equalsIgnoreCase(uri.getScheme())) { // 如果是file类型的Uri,直接获取图片路径即可 imagePath = uri.getPath(); } System.out.println("imagePath路径:"+imagePath); displayImage(imagePath); // 根据图片路径显示图片 } private void handleImageBeforeKitKat(Intent data) { Uri uri = data.getData(); String imagePath = getImagePath(uri, null); displayImage(imagePath); } private String getImagePath(Uri uri, String selection) { String path = null; // 通过Uri和selection来获取真实的图片路径 Cursor cursor = getContentResolver().query(uri, null, selection, null, null); if (cursor != null) { if (cursor.moveToFirst()) { path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); } cursor.close(); } return path; } private void displayImage(String imagePath) { if (imagePath != null) { Bitmap bitmap = BitmapFactory.decodeFile(imagePath); picture.setImageBitmap(bitmap); } else { Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show(); } } //TODO public void upload(View view) { new Thread(new Runnable() { @Override public void run() { // File file = new File("/storage/emulated/0/Tencent/QQ_Images/-1a45eb02c89a3895.jpg"); File file = new File(imagePath); System.out.println("测试返回结果imagePath:"+imagePath); OkHttpClient okHttpClient = new OkHttpClient(); RequestBody body = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", file.getName(), MultipartBody.create(MediaType.parse("multipart/form-data"), new File(imagePath))) .build(); String url = "http://ip:8001/server/fileoss"; Request request = new Request.Builder() .url(url) .post(body) .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); Gson gson = new GsonBuilder().create(); ResultGson resultGson = gson.fromJson(result, ResultGson.class); System.out.println("测试返回结果:"+result); System.out.println("测试返回结果:"+resultGson); System.out.println("测试返回结果:"+resultGson.getData()); System.out.println("测试返回结果:"+resultGson.getCode()); System.out.println("测试返回结果:"+resultGson.getData().get("url")); } }); } }).start(); } }

这里我先打开相册。然后选中照片,并在imageView里显示出来,然后再在点击上传,通过后端的接口,将照片上传至服务器中。日志显示成功!

10拍照上传 Android android拍照上传到服务器_xml_03

4、阿里云OSS服务

打开阿里云的OSS服务,发现存储成功。

10拍照上传 Android android拍照上传到服务器_spring boot_04

10拍照上传 Android android拍照上传到服务器_10拍照上传 Android_05

二、后端搭建

这里新建一个Springboot项目。这里可以去参照《Android使用OKhttp3实现登录注册功能+springboot搭建后端》,我也是在这个基础上继续搭建的。主要修改以下这些代码。

10拍照上传 Android android拍照上传到服务器_10拍照上传 Android_06

1、application.properties# 服务端口 server.port=8001 # 服务名 spring.application.name=heartrate # 环境设置:dev、test、prod spring.profiles.active=dev # mysql数据库连接 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://ip:3310/heartrate?serverTimezone=GMT%2B8&useSSL=false spring.datasource.username=root spring.datasource.password=123456 #返回json的全局时间格式 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8 #mybatis日志//要使用logback日志,就需要注释掉 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl #配置mapper xml文件的路径 mybatis-plus.mapper-locations=classpath:com/atguigu/eduservice/mapper/xml/*.xml #阿里云 OSS #不同的服务器,地址不同 aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com aliyun.oss.file.keyid=keyid aliyun.oss.file.keysecret=keysecret #bucket可以在控制台创建,也可以使用java代码创建 aliyun.oss.file.bucketname=ahuwhq

这里换成自己阿里云申请到的keyid和keysecret

2、OssServicepublic interface OssService { //上传头像到oss String uploadFileAvatar(MultipartFile file); }3、OssServiceImpl@Service public class OssServiceImpl implements OssService { //上传头像到oss @Override public String uploadFileAvatar(MultipartFile file) { // 工具类获取值 String endpoint = ConstantPropertiesUtils.END_POINT; String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID; String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET; String bucketName = ConstantPropertiesUtils.BUCKET_NAME; try { // 创建OSS实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); //获取上传文件输入流 InputStream inputStream = file.getInputStream(); System.out.println("文件输入流:"+file.getInputStream()); System.out.println("文件输入流:"+file.getContentType()); //获取文件名称 String fileName = file.getOriginalFilename(); System.out.println("文件名称:"+file.getOriginalFilename()); //1 在文件名称里面添加随机唯一的值 String uuid = UUID.randomUUID().toString().replaceAll("-",""); // yuy76t5rew01.jpg fileName = uuid+fileName; //2 把文件按照日期进行分类 //获取当前日期 // 2019/11/12 String datePath = new DateTime().toString("yyyy/MM/dd"); //拼接 // 2019/11/12/ewtqr313401.jpg fileName = datePath+"/"+fileName; //调用oss方法实现上传 //第一个参数 Bucket名称 //第二个参数 上传到oss文件路径和文件名称 aa/bb/1.jpg //第三个参数 上传文件输入流 ossClient.putObject(bucketName,fileName , inputStream); // 关闭OSSClient。 ossClient.shutdown(); //把上传之后文件路径返回 //需要把上传到阿里云oss路径手动拼接出来 // https://edu-guli-1010.oss-cn-beijing.aliyuncs.com/01.jpg String url = "https://"+bucketName+"."+endpoint+"/"+fileName; return url; }catch(Exception e) { e.printStackTrace(); return null; } } }4、ConstantPropertiesUtils.java/** * 常量类,读取配置文件application.properties中的配置 */ @Component //@PropertySource("classpath:application.properties") public class ConstantPropertiesUtils implements InitializingBean { @Value("${aliyun.oss.file.endpoint}") private String endpoint; @Value("${aliyun.oss.file.keyid}") private String keyId; @Value("${aliyun.oss.file.keysecret}") private String keySecret; @Value("${aliyun.oss.file.bucketname}") private String bucketName; public static String END_POINT; public static String ACCESS_KEY_ID; public static String ACCESS_KEY_SECRET; public static String BUCKET_NAME; @Override public void afterPropertiesSet() throws Exception { END_POINT = endpoint; ACCESS_KEY_ID = keyId; ACCESS_KEY_SECRET = keySecret; BUCKET_NAME = bucketName; } }5、OssController.java@RestController @RequestMapping("/server/fileoss") //@CrossOrigin public class OssController { @Autowired private OssService ossService; //上传头像的方法 @PostMapping public R uploadOssFile(MultipartFile file) { //获取上传文件 MultipartFile //返回上传到oss的路径 String url = ossService.uploadFileAvatar(file); return R.ok().data("url",url); } }6、MainApplication.java@SpringBootApplication @ComponentScan(basePackages = {"com.message"}) public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }

这样就可以启动这个项目了。打开swagger进行测试

10拍照上传 Android android拍照上传到服务器_ide_07

,然后使用maven打包,上传至服务器就可以了。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3