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

一、前端创建Android项目

1、布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent" ><Buttonandroid:id="@+id/take_photo"android:layout_width="match_parent"android:layout_height="wrap_content"android:backgroundTint="#E91E63"android:text="Take Photo" /><Buttonandroid:id="@+id/choose_from_album"android:layout_width="match_parent"android:layout_height="wrap_content"android:backgroundTint="#E91E63"android:text="Choose From Album" /><Buttonandroid:id="@+id/upload"android:layout_width="match_parent"android:layout_height="wrap_content"android:backgroundTint="#E91E63"android:onClick="upload"android:text="上传" /><ImageViewandroid:id="@+id/picture"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal" />
</LinearLayout>

2、AndroidManifest.xml申请权限

    <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" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:requestLegacyExternalStorage="true"android:networkSecurityConfig="@xml/network_security_config"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Login"><activity android:name=".Avatarupload"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity>  </application>

android:requestLegacyExternalStorage=“true”:targetSdkVersion<29 的应用程序默认带有requestLegacyExternalStorage=true属性,如果targetSdkVersion>30就加上这句话,还有网络权限,还需要在配置一下android:networkSecurityConfig="@xml/network_security_config"
network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config><base-config cleartextTrafficPermitted="true" />
</network-security-config>

3、Avatarupload.java

public 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;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic 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); // 打开相册}@Overridepublic 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:}}@Overrideprotected 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]; // 解析出数字格式的idString 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();}}//TODOpublic void upload(View view) {new Thread(new Runnable() {@Overridepublic 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() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic 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里显示出来,然后再在点击上传,通过后端的接口,将照片上传至服务器中。日志显示成功!

4、阿里云OSS服务

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

二、后端搭建

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

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、OssService

public interface OssService {//上传头像到ossString uploadFileAvatar(MultipartFile file);
}

3、OssServiceImpl

@Service
public class OssServiceImpl implements OssService {//上传头像到oss@Overridepublic 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.jpgfileName = uuid+fileName;//2 把文件按照日期进行分类//获取当前日期//   2019/11/12String datePath = new DateTime().toString("yyyy/MM/dd");//拼接//  2019/11/12/ewtqr313401.jpgfileName = 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.jpgString 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;@Overridepublic 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 {@Autowiredprivate OssService ossService;//上传头像的方法@PostMappingpublic 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进行测试

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

Android摄像头相册使用+上传照片至服务器(上篇)相关推荐

  1. android 与后台实时视频,android选择视频文件上传到后台服务器

    本文实例为大家分享了android选择视频文件上传到后台服务器的具体代码,供大家参考,具体内容如下 选择本地视频文件 首先第一步打开打开相册选择视频文件: Intent intent = new In ...

  2. 摄像头网页服务器,js调用本地摄像头拍照并上传到web服务器

    [实例简介] js调用本地摄像头拍照并上传到web服务器.后台使用java实现图片的接收和存储,上传的图片默认保存到项目下的images文件夹中. [实例截图] [核心代码] MyCamera └── ...

  3. Android使用XUtils框架上传照片(一张或多张)和文本,server接收照片和文字(无乱码)...

    Android上传图片,这里我使用了如今比較流行的XUtils框架.该框架能够实现文件上传.文件下载.图片缓存等等,有待研究. 以下是Android端上传的代码: xUtils.jar下载 Strin ...

  4. 指定间隔定时拍照抓拍摄像头(机)FTP上传照片|内存卡存储 [WiFi/4G传输][太阳能电池供电方案]

    -SC-GP-CAM是基于4G或wifi的无线定时拍照/抓拍录像FTP上传照片的相机摄像头.可广泛应用于仪器仪表的示数抓拍识别,文物.岩土.水文水利领域的照片抓拍和视频监控. 支持wifi/4G以太网 ...

  5. 原生js实现打开手机相册并上传文件到服务器

    js实现上传文件服务器,打开手机相册 在common文件夹中封装公共方法 // 上传照片upimage () {// 打开手机相册return new Promise((resolve, reject ...

  6. 教师资格证上传照片显示服务器错误,教师资格证报名照片传不上去怎么办,照片有哪些要求—中小学教师资格网...

    教师资格证报名照片传不上去怎么办-中小学教师资格网.中小学教师资格考试报名入口将于2017年9月5日开通[快速报名入口],各位考生要熟读教师资格报考注意事项,并在规定时间内及时报名并积极备考.在报名中 ...

  7. 海康摄像头直播视频上传到流媒体服务器平台后如何降低延迟?(附TCP及UDP区别介绍)

    近期有位开发者为了用我们的国标GB28181流媒体服务器进行测试,在自己的现场环境安装了海康的有线摄像头,通过4g转wifi来连接,上传视频到平台之后,打开视频最长需要10分钟左右才能显示,大多数时候 ...

  8. 上传照片显示服务器繁忙怎么回事,解决WordPress上传图片“图像后期处理失败,可能是服务器忙或没有足够的资源”问题...

    最近WordPress升级到了最新的5.6X版本,会出现"图像后期处理失败.如果这是一张照片或较大图像,请将其缩小到2500像素并重新上传."的问题.从网上查了下,大概有几种解决方 ...

  9. android 选择视频文件 上传到后台服务器

    http://blog.csdn.net/d276031034/article/details/52652749

最新文章

  1. diy手工制作泡沫小球_废物利用手工DIY教程。一次性筷子变废为宝,手工制作木屋模型...
  2. app微信支付的集成步骤
  3. ssh服务端口转发详解
  4. 【渝粤教育】 国家开放大学2020年春季 2772家畜环境卫生与设施 参考试题
  5. CLR线程概览(一)
  6. 事务java_Java事务之一——Java事务的基本问题
  7. winform 防止多開
  8. Duplicate class com.blankj.utilcode.BuildConfig found in modules classes.jar
  9. Java--文本文档编写Java代码
  10. 销售方法总结思维导图模板分享
  11. Systrace 学习笔记
  12. 计算机综述论文能发期刊吗,发表计算机算法论文的sci期刊
  13. 关于MacBook蓝牙键盘鼠标耳机等设备各种的卡顿、黏滞、断开连接等各种问题解决方案
  14. NYOJ_1248_海岛争霸【最短路】
  15. 黑马头条从登陆页到个人中心页
  16. 如何生成一个二维码?
  17. GFP-GAN学习笔记
  18. 数字化转型 — 新能源汽车 — 产品设计与研发流程
  19. 美摄云服务方案:专为轻量化视频制作场景打造
  20. 外行人对软件测试的常见误解

热门文章

  1. JS手机端touch事件计算滑动距离的方法
  2. 记录一下今天发生的linux挖矿病毒之networkservice进程
  3. B01-在Excel中,编号包括字母和数字时,如何根据数字从大到小排序
  4. 智能表单设计器FreeForm常量定义及用途
  5. 作为电子工程师,这些PCB走线方式你要知道
  6. 云安全—未来的病毒防御体系在云+端
  7. 【C语言实现小游戏篇】一起来回忆童年,写一写你童年的井字棋吧~ [ C语言实现 ] [ 超详细,超清楚 ] [ 有代码 ]
  8. 关于跨境项目UTC时间与PST时间转换
  9. Facebook为人才收购荷兰软件美工计划公司
  10. Vue笔记(狂神说)