安卓,弹出选项框从相册相机中选择图片并显示。动态权限的处理,附源代码。

来源:互联网 发布:怎么与isp网络签署协议 编辑:程序博客网 时间:2024/06/06 17:20

处女博客,弹出选项框从相册/相机中选择图片并显示,可以反复选择。多的不说,先上图:

1.初始界面:图片来自阿里矢量库。


2.点击相机按钮:出现选项框


3.先从图库选吧


4.再次点击,又弹选项框


5.测试拍照


6.测试多次选择:



效果就是这样,可以根据自己需求不同挖该代码:

新手,代码写得很烂;

上传部分代码吧:

dialog选项框。

@Overridepublic void onClick(View v) {    switch (v.getId()) {        case R.id.Tv_pic1:            AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);            // 设置参数            builder1.setTitle("选择")                    .setMessage("选择你要打开的应用")                    .setPositiveButton("相机", new DialogInterface.OnClickListener() {                        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)                        @Override                        public void onClick(DialogInterface dialog,                                            int which) {                            dialog.dismiss();                            //动态权限判断申请                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                                int checkCallPhonePermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);                                if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {                                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);                                    return;                                } else {                                    Intent intent0 = new Intent();                                    intent0.setAction(MediaStore.ACTION_IMAGE_CAPTURE);                                    imageFileUri = getOutFileUri(TYPE_FILE_IMAGE);                                    intent0.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri);                                    if (intent0.resolveActivity(getPackageManager()) != null) {                                        startActivityForResult(intent0, SYSTEM_CAMERA_REQUESTCODE);                                    }                                }                            }                            else {                                Intent intent0 = new Intent();                                intent0.setAction(MediaStore.ACTION_IMAGE_CAPTURE);                                imageFileUri = getOutFileUri(TYPE_FILE_IMAGE);                                intent0.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri);                                if (intent0.resolveActivity(getPackageManager()) != null) {                                    startActivityForResult(intent0, SYSTEM_CAMERA_REQUESTCODE);                                }                            }                        }                    })                    .setNegativeButton("相册", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog,                                            int which) {                            dialog.dismiss();                            imageFileUri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;                            Intent intent0 = new Intent(Intent.ACTION_PICK, imageFileUri);                            startActivityForResult(intent0, SYSTEM_ALBUM_REQUESTCODE);                        }                    });            builder1.create().show();            break;        case R.id.Img_show:            AlertDialog.Builder builder2 = new AlertDialog.Builder(MainActivity.this);            // 设置参数            builder2.setTitle("选择")                    .setMessage("选择你要打开的应用")                    .setPositiveButton("相机", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog,                                            int which) {                            dialog.dismiss();                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                                int checkCallPhonePermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA);                                if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED) {                                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);                                    return;                                } else {                                    Intent intent0 = new Intent();                                    intent0.setAction(MediaStore.ACTION_IMAGE_CAPTURE);                                    imageFileUri = getOutFileUri(TYPE_FILE_IMAGE);                                    intent0.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri);                                    if (intent0.resolveActivity(getPackageManager()) != null) {                                        startActivityForResult(intent0, SYSTEM_CAMERA_REQUESTCODE);                                    }                                }                            }                            else {                                Intent intent0 = new Intent();                                intent0.setAction(MediaStore.ACTION_IMAGE_CAPTURE);                                imageFileUri = getOutFileUri(TYPE_FILE_IMAGE);                                intent0.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri);                                if (intent0.resolveActivity(getPackageManager()) != null) {                                    startActivityForResult(intent0, SYSTEM_CAMERA_REQUESTCODE);                                }                            }                        }                    })                    .setNegativeButton("相册", new DialogInterface.OnClickListener() {                        @Override                        public void onClick(DialogInterface dialog,                                            int which) {                            dialog.dismiss();                            imageFileUri = android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI;                            Intent intent0 = new Intent(Intent.ACTION_PICK, imageFileUri);                            startActivityForResult(intent0, SYSTEM_ALBUM_REQUESTCODE);                        }                    });            builder2.create().show();            break;    }}
ActivityForResult处理:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    switch (requestCode) {        case SYSTEM_ALBUM_REQUESTCODE:                afterPhoto.setVisibility(View.VISIBLE);                beforPhoto.setVisibility(View.INVISIBLE);                picshow.setVisibility(View.VISIBLE);                //获取图库得到数据并显示                Uri selectedImage = data.getData();                String[] filePathColumns = {MediaStore.Images.Media.DATA};                Cursor c = getContentResolver().query(selectedImage, filePathColumns, null, null, null);                c.moveToFirst();                int columnIndex = c.getColumnIndex(filePathColumns[0]);                String imagePath = c.getString(columnIndex);                verifyStoragePermissions(MainActivity.this);                setPicToImageView(picshow,imagePath);                c.close();            break;        case SYSTEM_CAMERA_REQUESTCODE:            afterPhoto.setVisibility(View.VISIBLE);            beforPhoto.setVisibility(View.INVISIBLE);            picshow.setVisibility(View.VISIBLE);            String picpath = savePhoto(imageFileUri.getEncodedPath());            setPicToImageView(picshow, picpath);        default:            break;    }}

xml就没什么啦;一个样式,不过去掉安卓原生的标题栏入坑了。是
<item name="windowNoTitle">true</item>
一直写的
<item name="android:windowNoTitle">true</item>
xml代码:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout        xmlns:android="http://schemas.android.com/apk/res/android"        xmlns:tools="http://schemas.android.com/tools"        android:id="@+id/activity_main"        android:layout_width="match_parent"        android:layout_height="match_parent"        tools:context="com.huqi.takephoto.MainActivity">    <TextView            android:id="@+id/title_info"            android:layout_width="match_parent"            android:layout_height="40dp"            android:text="图片选择"            android:gravity="center"            android:textColor="@android:color/black"            android:background="#F8F8FF"            android:textSize="18sp" />    <RelativeLayout            android:layout_below="@+id/title_info"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:layout_marginTop="80dp"            android:paddingBottom="5dp" >        <TextView                android:id="@+id/Tv_pic1"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_marginLeft="60dp"                android:drawableTop="@drawable/photo"                android:text="  选择图片"                android:gravity="center"                android:textSize="15sp"                android:layout_centerHorizontal="true"                android:layout_alignBottom="@+id/Img_show"/>        <ImageView                android:id="@+id/Img_show"                android:layout_width="150dp"                android:layout_height="150dp"                android:layout_gravity="center"                android:visibility="invisible"                android:layout_centerHorizontal="true"/>        <TextView                android:id="@+id/Tv_pic2"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="  图片展示  "                android:visibility="invisible"                android:layout_marginLeft="30dp"                android:textSize="15sp"                android:layout_alignLeft="@+id/Img_show"                android:layout_marginTop="10dp"                android:layout_below="@+id/Img_show"/>    </RelativeLayout></RelativeLayout>


另外还有读写权限:
<!-- 用于读取手机当前的状态 --><uses-permission android:name="android.permission.READ_PHONE_STATE"/><!-- 写入扩展存储,向扩展卡写入数据,用于写入tup--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>
安卓6.0动态权限也在代码里处理了:
// 检测相机是否存在@SuppressWarnings("unused")private boolean checkCameraHardWare(Context context) {    PackageManager packageManager = context.getPackageManager();    return packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA);}private void verifyStoragePermissions(Context context) {    int permissionWrite = ActivityCompat.checkSelfPermission(context,            Manifest.permission.WRITE_EXTERNAL_STORAGE);    if(permissionWrite != PackageManager.PERMISSION_GRANTED) {        ActivityCompat.requestPermissions(MainActivity.this, PERMISSION_EXTERNAL_STORAGE,                WRITE_SDCARD_PERMISSION_REQUEST_CODE);    }}
@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    switch (requestCode) {        // 打开相册选取:        case WRITE_SDCARD_PERMISSION_REQUEST_CODE:            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {            } else {                Toast.makeText(this, "读写内存卡内容权限被拒绝", Toast.LENGTH_SHORT).show();            }            break;        case 222:            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {                // Permission Granted            } else {                // Permission Denied                Toast.makeText(MainActivity.this, "很遗憾你把相机权限禁用了。请务必开启相机权限享受我们提供的服务吧。", Toast.LENGTH_SHORT)                        .show();            }            break;    }}


有了picpath后面做上传也很容易,我是用原生http,整理后下次博客再放。为了方便上传压缩图片,定义了bimp类,多次压缩的代码网上也有,
最近实习,有很多自己写的小demo。很多也是借鉴前人的。很喜欢这种分享的精神,空余时间我也会来写点小博客,照顾下新人。
待会加上githup的链接。





阅读全文
1 0
原创粉丝点击