Android(安卓)学习之《第一行代码》第二版 笔记(十八)调用摄像头拍照
16lz
2021-01-25
单击按钮调用摄像头拍照并用ImageView显示出来
一、知识点
- 应用关联缓存目录:
A.)指SD卡中专门用于存放当前应用缓存数据的位置。
B.)调用getExternalCacheDir()方法可得到该目录。
C.)具体路径:/sdcard/Android/data//cache
D.)选择该目录存放图片的原因:从Android 6.0开始,读写SD卡被列为危险权限,如果将图片存放在SD卡的任何其他目录,都要进行运行时权限处理,而使用该目录则可以跳过这一步。 - FileProvider
A.)是一种特殊的内容提供器,使用了和内容提供器类似的机制来对数据进行保护,可以选择性地将封装过的Uri共享给外部,从而提高应用的安全性。
B.)方法getUriForFile(…)将File对象转换成一个封装过的Uri对象
参数一:Context对象;参数二:任意唯一字符串;参数三:File对象
二、Demo
1. 效果图
2. activity_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:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.thinkpad.cameraalbumtest.MainActivity"> <Button android:id="@+id/take_photo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="点击拍照"/> <ImageView android:id="@+id/picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"/>LinearLayout>
3. MainActivity.java
import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Build;import android.provider.MediaStore;import android.support.v4.content.FileProvider;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ImageView;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;public class MainActivity extends AppCompatActivity { public static final int TAKE_PHOTO = 1; private ImageView picture; private Button takePhoto; private Uri imageUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取控件实例 takePhoto = (Button)findViewById(R.id.take_photo); picture = (ImageView)findViewById(R.id.picture); //设置按钮点击事件 takePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //创建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){ //当系统版本不低于Android 7.0时,调用FileProvider的getUriForFile()方法将File对象转换成一个封装过的Uri对象 //参数一:Context对象;参数二:任意唯一字符串;参数三:File对象 imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.thinkpad.cameraalbumtest.fileprovider",outputImage); }else{ imageUri = Uri.fromFile(outputImage); } //启动相机程序 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri); startActivityForResult(intent,TAKE_PHOTO); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(requestCode){ case TAKE_PHOTO: if (resultCode == RESULT_OK){ try{ //将拍摄的照片显示出来 先将照片解析成Bitmap对象,再将它设置到ImageView中显示出来 Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); picture.setImageBitmap(bitmap); }catch(FileNotFoundException e){ e.printStackTrace(); } } break; default: break; } }}
4. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.thinkpad.cameraalbumtest"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> intent-filter> activity> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.thinkpad.cameraalbumtest.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> provider> application>manifest>
5. 在res目录下新建xml目录,新建文件file_paths.xml
<?xml version="1.0" encoding="utf-8"?><paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path="" />paths>
整理学习自郭霖大佬的《第一行代码》
目前小白一名,持续学习Android中,如有错误请批评指正!
更多相关文章
- android的网络通讯(Http通讯)封装类
- 解析Android之Volley框架(1)
- Android进程通信(IPC)之AIDL对象传递
- Android(安卓): 录音实现之AudioRecord类
- android debug set screen rotation
- cocos2d-x for android:HelloWorld 解读
- Android(安卓)编译so文件 MP4V2
- [转]android下面res目录
- Android(安卓)内存泄漏总结