android 动态相机权限,Android 6.0动态权限调用相册相机

这篇博客详细介绍了如何在Android应用中实现拍照和从相册选择图片的功能。通过创建简单的XML布局文件,定义按钮触发拍照和选择图片的事件,并在Activity中处理权限请求和回调,实现了图片获取并显示在ImageView上的流程。
摘要由CSDN通过智能技术生成

1.创建页面简单布局demo.xml

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context="com.example.takephoto.MainActivity" >

android:id="@+id/button"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:onClick="takePhone"

android:text="拍照" />

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:onClick="choosePhone"

android:text="相册选择" />

android:id="@+id/image"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:scaleType="centerCrop"

android:src="@drawable/ic_launcher" />

2.Activity整体代码

/**

* 相册的选择

*

* @author Sugar

*

*/

@SuppressLint("Override")

public class DemoActivity extends FragmentActivity {

private static final int CROP_PHOTO = 2;

private static final int PICK_PIC = 3;

private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE1 = 4;

private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE2 = 5;

private File output;

private Uri imageUri;

private ImageView imageView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.demo);

imageView = (ImageView) findViewById(R.id.image);

}

/**

* 相机

*

* @param view

*/

public void takePhone(View view) {

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

ActivityCompat

.requestPermissions(

this,

new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },

MY_PERMISSIONS_REQUEST_CALL_PHONE2);

} else {

takePhoto();

}

}

/**

* 相册

*

* @param view

*/

public void choosePhone(View view) {

if (ContextCompat.checkSelfPermission(this,

Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

ActivityCompat

.requestPermissions(

this,

new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },

MY_PERMISSIONS_REQUEST_CALL_PHONE2);

} else {

choosePhoto();

}

}

/**

* 拍照

*/

private void takePhoto() {

/**

* 最后一个参数是文件夹的名称,可以随便起

*/

File file = new File(Environment.getExternalStorageDirectory(), "拍照");

if (!file.exists()) {

file.mkdir();

}

/**

* 这里将时间作为不同照片的名称

*/

output = new File(file, System.currentTimeMillis() + ".jpg");

/**

* 如果该文件夹已经存在,则删除它,否则创建一个

*/

try {

if (output.exists()) {

output.delete();

}

output.createNewFile();

} catch (Exception e) {

e.printStackTrace();

}

/**

* 隐式打开拍照的Activity,并且传入CROP_PHOTO常量作为拍照结束后回调的标志

*/

imageUri = Uri.fromFile(output);

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");

intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

startActivityForResult(intent, CROP_PHOTO);

}

/**

* 从相册选取图片

*/

private void choosePhoto() {

/**

* 打开选择图片的界面

*/

Intent intent = new Intent(Intent.ACTION_PICK);

intent.setType("image/*");// 相片类型

startActivityForResult(intent, PICK_PIC);

}

/**

* 调用相册和拍照之后的返回

*/

public void onActivityResult(int req, int res, Intent data) {

switch (req) {

/**

* 拍照的请求标志

*/

case CROP_PHOTO:

if (res == RESULT_OK) {

try {

/**

* 该uri就是照片文件夹对应的uri

*/

Bitmap bit = BitmapFactory

.decodeStream(getContentResolver().openInputStream(

imageUri));

imageView.setImageBitmap(bit);

} catch (Exception e) {

e.printStackTrace();

}

}

break;

/**

* 从相册中选取图片的请求标志

*/

case PICK_PIC:

if (res == RESULT_OK) {

try {

/**

* 该uri是上一个Activity返回的

*/

Uri uri = data.getData();

Bitmap bit = BitmapFactory

.decodeStream(getContentResolver().openInputStream(

uri));

imageView.setImageBitmap(bit);

} catch (Exception e) {

e.printStackTrace();

}

}

break;

default:

break;

}

}

/**

* 动态权限

*/

@Override

public void onRequestPermissionsResult(int requestCode,

String[] permissions, int[] grantResults) {

if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE1) {

if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

takePhoto();

} else {

// Permission Denied

Toast.makeText(DemoActivity.this, "Permission Denied",

Toast.LENGTH_SHORT).show();

}

}

if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE2) {

if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

} else {

// Permission Denied

Toast.makeText(DemoActivity.this, "Permission Denied",

Toast.LENGTH_SHORT).show();

}

}

}

}

备份记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值