Android(安卓)选取图片、手机拍照以及保存图片到本地、读取图片
16lz
2021-01-24
在开发app中经常会遇到打开图库选取图片、手机拍照得到图片作为用户的头像。并不难,直接上代码;
content_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.administrator.camerademo.MainActivity"> <ImageView android:id="@+id/img" android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center_horizontal" android:src="@mipmap/ic_launcher" /> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="选取图片" /> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="手机拍照" />LinearLayout>
package com.example.administrator.camerademo;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn; private Button btn2; private ImageView img; public String filePath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.content_main); //保存图片的路径 filePath=Environment.getExternalStorageDirectory(). getAbsolutePath()+"/a.png"; btn = (Button) findViewById(R.id.btn1); btn2 = (Button) findViewById(R.id.btn2); img = (ImageView) findViewById(R.id.img); btn.setOnClickListener(this); btn2.setOnClickListener(this); //读取保存的位图(图片) Bitmap bitmap1= readImg(); if(bitmap1!=null){ img.setImageBitmap(bitmap1); }else{ return; } } @Override public void onClick(View v) { Intent intent; switch (v.getId()) { case R.id.btn1: //打开手机的图库; intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, 0x1); break; case R.id.btn2: intent = new Intent(); //MediaStore.ACTION_IMAGE_CAPTURE 调用系统的照相机 intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 0x3); break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 0x1) { if (data != null) { Uri uri = data.getData(); getImg(uri); } else { return; } } if (requestCode == 0x2) { if (data != null) { Bundle bundle = data.getExtras(); //得到图片 Bitmap bitmap = bundle.getParcelable("data"); //保存到图片到本地 saveImg(bitmap); //设置图片 img.setImageBitmap(bitmap); } else { return; } } if (requestCode == 0x3) { if (data != null) { Bundle bundle = data.getExtras(); Bitmap bitmap = bundle.getParcelable("data"); img.setImageBitmap(bitmap); } else { return; } } } //读取位图(图片) private Bitmap readImg() { File mfile = new File(filePath); Bitmap bm = null; if (mfile.exists()) { //若该文件存在 bm = BitmapFactory.decodeFile(filePath); } return bm; } //保存图片到本地,下次直接读取 private void saveImg(Bitmap mBitmap) { File f = new File(filePath); try { //如果文件不存在,则创建文件 if(!f.exists()){ f.createNewFile(); } //输出流 FileOutputStream out = new FileOutputStream(f); /** mBitmap.compress 压缩图片 * * Bitmap.CompressFormat.PNG 图片的格式 * 100 图片的质量(0-100) * out 文件输出流 */ mBitmap.compress(Bitmap.CompressFormat.PNG, 100, out); out.flush(); out.close(); Toast.makeText(this,f.getAbsolutePath().toString(),Toast.LENGTH_SHORT).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void getImg(Uri uri) { try { InputStream inputStream = getContentResolver().openInputStream(uri); //从输入流中解码位图 // Bitmap bitmap = BitmapFactory.decodeStream(inputStream); //保存位图 // img.setImageBitmap(bitmap); cutImg(uri); //关闭流 inputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //裁剪图片 private void cutImg(Uri uri) { if (uri != null) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); //true:出现裁剪的框 intent.putExtra("crop", "true"); //裁剪宽高时的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); //裁剪后的图片的大小 intent.putExtra("outputX", 300); intent.putExtra("outputY", 300); intent.putExtra("return-data", true); // 返回数据 intent.putExtra("output", uri); intent.putExtra("scale", true); startActivityForResult(intent, 0x2); } else { return; } }}
在AndroidManifest.xml加入以下三个权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
更多相关文章
- 四极管:Android(安卓)rameworks/base/libs/utils/RefBase.cpp:507
- android 修改按power键弹出时间短的问题
- Android(安卓)应用软件开发(十一)文件下载
- Android(安卓)播放本地视频的动态权限问题
- 为android编译ffmpeg+x264+faac
- layui 上传图片 移动端 调用相机
- android 动态改变图片大小
- android 开发 获取各种intent (图片、apk文件、excel、pdf等文件)
- 在xml配置文件中设置字体加粗