Android头像上传实战模拟

在开发中头像的上传应该是必不可少的,话不多说上效果图!

点击头像弹出PopupWindow分别三个按钮。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.myapplication.MainActivity"><ImageView android:id="@+id/img"android:src="@mipmap/ic_launcher_round"android:layout_width="100dp"android:layout_height="100dp" /></LinearLayout>

布局很简单就一个图片。

package com.example.myapplication;import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.Toast;import java.io.File;
import java.io.IOException;
import java.util.Random;public class MainActivity extends AppCompatActivity {private Button startCameraButton = null;private ImageView img;private Uri photoUri = null;private Uri photoOutputUri = null;//private static final int TAKE_PHOTO_PERMISSION_REQUEST_CODE = 0; // 拍照的权限处理返回码private static final int WRITE_SDCARD_PERMISSION_REQUEST_CODE = 1; // 读储存卡内容的权限处理返回码private static final int TAKE_PHOTO_REQUEST_CODE = 3; // 拍照返回的 requestCodeprivate static final int CHOICE_FROM_ALBUM_REQUEST_CODE = 4; // 相册选取返回的 requestCodeprivate static final int CROP_PHOTO_REQUEST_CODE = 5; // 裁剪图片返回的 requestCode//private Button xiangji;private Button xiangce;private Button falish;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {img = (ImageView) findViewById(R.id.img);img.setOnClickListener(new View.OnClickListener() {private PopupWindow popupWindow;@Overridepublic void onClick(View view) {View layout = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_pop, null);popupWindow = new PopupWindow(MainActivity.this);popupWindow.setContentView(layout);popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);popupWindow.showAtLocation(img, Gravity.BOTTOM| Gravity.RIGHT,150,0);xiangji=layout.findViewById(R.id.an1);xiangce=layout.findViewById(R.id.an2);falish=layout.findViewById(R.id.an3);//获取popupwinder里的id按钮id来进行点击falish.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {popupWindow.dismiss();Toast.makeText(MainActivity.this, "取消成功", Toast.LENGTH_SHORT).show();}});//相册xiangce.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 打开系统图库的 Action,等同于: "android.intent.action.GET_CONTENT"Intent choiceFromAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);// 设置数据类型为图片类型choiceFromAlbumIntent.setType("image/*");startActivityForResult(choiceFromAlbumIntent, CHOICE_FROM_ALBUM_REQUEST_CODE);}});//拍照xiangji.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (v == xiangji) {// 同上面的权限申请逻辑if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {/** 下面是对调用相机拍照权限进行申请*/ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA,}, TAKE_PHOTO_PERMISSION_REQUEST_CODE);} else {startCamera();}// 从相册获取} else if (v == xiangce) {choiceFromAlbum();}}});}});if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {// 申请读写内存卡内容的权限ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA}, TAKE_PHOTO_PERMISSION_REQUEST_CODE);}}private void choiceFromAlbum() {// 打开系统图库的 Action,等同于: "android.intent.action.GET_CONTENT"Intent choiceFromAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);// 设置数据类型为图片类型choiceFromAlbumIntent.setType("image/*");startActivityForResult(choiceFromAlbumIntent, CHOICE_FROM_ALBUM_REQUEST_CODE);}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {// 调用相机拍照:case TAKE_PHOTO_PERMISSION_REQUEST_CODE:// 如果用户授予权限,那么打开相机拍照if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {startCamera();} else {Toast.makeText(this, "拍照权限被拒绝", Toast.LENGTH_SHORT).show();}break;// 打开相册选取:case WRITE_SDCARD_PERMISSION_REQUEST_CODE:if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {} else {Toast.makeText(this, "读写内存卡内容权限被拒绝", Toast.LENGTH_SHORT).show();}break;}//        switch (requestCode){
//            case 1:
//                if (grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED) {
//                    Xiangji();
//                }else {
//                    Toast.makeText(this, "授权失败", Toast.LENGTH_SHORT).show();
//                }
//        }}private void startCamera() {/*** 设置拍照得到的照片的储存目录,访问应用的缓存路径不需要读写内存卡的申请权限,* 因此,这里为了方便,将拍照得到的照片存在这个缓存目录中*/File file = new File(getExternalCacheDir(), "image.jpg");try {if (file.exists()) {file.delete();}file.createNewFile();} catch (IOException e) {e.printStackTrace();}if (Build.VERSION.SDK_INT >= 24) {photoUri = FileProvider.getUriForFile(this, "com.zhi_dian.provider", file);} else {photoUri = Uri.fromFile(file); // Android 7.0 以前使用原来的方法来获取文件的 Uri}// 打开系统相机的 Action,等同于:"android.media.action.IMAGE_CAPTURE"Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 设置拍照所得照片的输出目录takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);startActivityForResult(takePhotoIntent, TAKE_PHOTO_REQUEST_CODE);}public static void take(Activity activity, Uri imageuri, int requestCode) {Intent intentdemo = new Intent();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {{intentdemo.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);}intentdemo.setAction(MediaStore.ACTION_IMAGE_CAPTURE);intentdemo.putExtra(MediaStore.EXTRA_OUTPUT, imageuri);activity.startActivityForResult(intentdemo, requestCode);}}//一下是从相册选取截图上传//private void cropPhoto(Uri inputUri) {// 调用系统裁剪图片的 ActionIntent cropPhotoIntent = new Intent("com.android.camera.action.CROP");//cropPhotoIntent.setDataAndType(inputUri, "image/*");// 授权应用读取 Uri,这一步要有.不然裁剪程序会崩溃cropPhotoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// 设置图片的最终输出目录cropPhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoOutputUri = Uri.parse("file:sdcard/image_output" + new Random().nextInt(99) + ".jpg"));startActivityForResult(cropPhotoIntent, CROP_PHOTO_REQUEST_CODE);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode == RESULT_OK) {// 通过返回码判断是哪个应用返回的数据switch (requestCode) {// 拍照case TAKE_PHOTO_REQUEST_CODE:cropPhoto(photoUri);break;// 相册选择case CHOICE_FROM_ALBUM_REQUEST_CODE:cropPhoto(data.getData());break;// 裁剪图片case CROP_PHOTO_REQUEST_CODE:File file = new File(photoOutputUri.getPath());if (file.exists()) {Bitmap bitmap = BitmapFactory.decodeFile(photoOutputUri.getPath());img.setImageBitmap(bitmap);} else {Toast.makeText(this, "无法获取您的照片", Toast.LENGTH_SHORT).show();}break;}}}
}

本人第一次发表博客,有什么意见欢迎提出!
如果对您有帮助请点个赞!

Android头像上传实战模拟相关推荐

  1. Android 头像上传的实现

    当我们点击头像想要进行头像上传时,我们可以给上传头像设置一个弹框效果,用来给用户提供相册选择和拍照两种选择. 这时我们可以使用PopupWindow实现 1. 定义图片存储位置 public void ...

  2. Android 头像上传

    内容概要 实例演示和原理讲解 从摄像头中获取图像 从图库中获取图像 在Android上对图像进行裁剪 图像上传并在服务器保存图像 实例演示和原理讲解 头像上传流程 从摄像头中获取图像 本课时的主要内容 ...

  3. Android头像上传--图片转base64,后台接收到的总是null问题

    图片转base64,后台接到为null问题 项目中,在使用头像上传的时候,将图片转为base64,后台总是收到的base64字符串是null.原以为是图片未压缩,导致图片过大,超过了Tomcat配置的 ...

  4. Android 头像上传

    第一步:权限和依赖 <uses-permission android:name="android.permission.INTERNET" /><uses-per ...

  5. Android头像上传时裁剪图片过大问题,裁剪大图片导致

    原先在完成头像上传功能的时候复制网上写好的代码,虽然也仔细研究过实现的过程但是这次项目中却遇到了一个很不解的问题,使用乐视手机实现图片裁剪的那一步骤中由于图片太大手机性能不够导致图片无法裁剪报出错误 ...

  6. Android图片上传(头像裁切+原图原样)

    还是那句话,最近项目比较忙拖了很久这篇文章终于完成了! 先看一下效果图: (一)头像裁切.上传服务器(效果图) 一般都是有圆形显示头像的,这里我自定义了一个ImageView,页面很干净但是看着很上档 ...

  7. 调用android的拍照或本地相册选取再实现相片上传服务器,Android调用系统相机、本地相册上传图片(头像上传(裁剪)、多张图片上传)...

    开发中基本上都会有头像上传的功能,有的app还需要多张图片同时上传,下面简单将头像上传以及多张图片上传功能整理一下.图片选择仿照微信选择图片的界面.[参考] 多图片选择器 !!!推荐一个动态权限请求的 ...

  8. Android kotlin上传头像实现

    Android 上传头像基本上是每个app都有的功能,虽然看起来简单,但是作为新手的我实现起来却没有那么简单,实现如下 从相册获取照片,代码如下 //从相册获取照片private fun getFro ...

  9. android自定义头像上传,android裁切图片之用于头像上传

    嘛话都不说,直接贴代码,也是在网上找的代码copy出来的! 页面代码 encoding="utf-8"?> android:orientation="vertica ...

最新文章

  1. 如何用简单易懂的例子解释隐马尔可夫模型?
  2. Byte和bit的区别?
  3. tensorflow只用CPU运行
  4. 基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现
  5. Ubuntu学习小结(一) 基础知识,系统安装,软件安装,解压缩
  6. 51nod 1218 最长递增子序列 V2(dp + 思维)
  7. 调用 Windows 7 中英文混合朗读
  8. 打造属于自己的 linux版(硬盘版或电子盘)view5 终端
  9. 仲裁时,年假有效期两年
  10. PLTS中计算Skew(计算延时差:对内/对间)
  11. html圆圈男女,html 圆形符号
  12. delphi显示jpg、png、gif图片
  13. 几款软件界面模型设计工具
  14. docker CLI官方教程 run方法解析(docer run 、docker attach 与 docker exec的区别)
  15. 高等数学 武忠祥强化班
  16. 第130章 SQL函数 SQRT
  17. IIS配置和发布网站
  18. illumina 双端测序(pair end)
  19. 渗透测试神器--Kali系统部署
  20. realme gt neo3 看屏幕是天马屏幕还是京东方(图文教程)

热门文章

  1. 医学图像分割损失函数Dice
  2. Number 常用工具类
  3. photoshop ps 美白 去污 磨皮 方法
  4. 立象条码打印机PPLB类单双标签打印
  5. 在计算机系统内部使用的汉子编码是,数据库系统工程师考试汉字编码输入码
  6. 智能视频分析技术及应用扫盲
  7. mri造影剂是用计算机控制滴注,CT、磁共振检查为什么要注射造影剂?
  8. 通配符SSL证书的作用有哪些
  9. django模型使用操作
  10. 微信小程序使用 npm 安装第三方包