首页 > 编程技术 > android

android中打开相机、打开相册进行图片的获取示例

发布时间:2017-1-22 11:04

这里介绍在Android中实现相机调取、拍照片、获取照片、存储新路径等已经打开相册、选择照片等功能,学习开发安卓应用的同学可以参考一下本文

首先看一下界面,很简单

配置读取内存卡和调用照相头的功能

 

 代码如下复制代码
<!-- 使用网络权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 写sd卡的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 读sd卡权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

 

下面是代码的主题

 

 代码如下复制代码

publicclassTakePhotosextendsActivityimplements

android.view.View.OnClickListener {

Button takePhoto;

Bitmap photo;

String picPath;

Button capture;

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_photo);

takePhoto = (Button) findViewById(R.id.button1);

capture = (Button) findViewById(R.id.capture);

takePhoto.setOnClickListener(this);

capture.setOnClickListener(this);

}

@Override

publicvoidonClick(View viewid) {

switch(viewid.getId()) {

caseR.id.button1: {// 打开相机

String state = Environment.getExternalStorageState();// 获取内存卡可用状态

if(state.equals(Environment.MEDIA_MOUNTED)) {

// 内存卡状态可用

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

startActivityForResult(intent,1);

}else{

// 不可用

Toast.makeText(TakePhotos.this,"内存不可用", Toast.LENGTH_LONG)

.show();

}

break;

}

caseR.id.capture: {// 打开相册

// 打开本地相册

Intent i =newIntent(

Intent.ACTION_PICK,

android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

// 设定结果返回

startActivityForResult(i,2);

break;

}

default:

break;

}

}

 

 

@Override

protectedvoidonActivityResult(intrequestCode,intresultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

if(data !=null) {

switch(requestCode) {

case1:

// 两种方式 获取拍好的图片

if(data.getData() !=null|| data.getExtras() !=null) {// 防止没有返回结果

Uri uri = data.getData();

if(uri !=null) {

this.photo = BitmapFactory.decodeFile(uri.getPath());// 拿到图片

}

if(photo ==null) {

Bundle bundle = data.getExtras();

if(bundle !=null) {

photo = (Bitmap) bundle.get("data");

FileOutputStream fileOutputStream =null;

try{

// 获取 SD 卡根目录 生成图片并

String saveDir = Environment

.getExternalStorageDirectory()

+"/dhj_Photos";

// 新建目录

File dir =newFile(saveDir);

if(!dir.exists())

dir.mkdir();

// 生成文件名

SimpleDateFormat t =newSimpleDateFormat(

"yyyyMMddssSSS");

String filename ="MT"+ (t.format(newDate()))

+".jpg";

// 新建文件

File file =newFile(saveDir, filename);

// 打开文件输出流

fileOutputStream =newFileOutputStream(file);

// 生成图片文件

this.photo.compress(Bitmap.CompressFormat.JPEG,

100, fileOutputStream);

// 相片的完整路径

this.picPath = file.getPath();

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

imageView.setImageBitmap(this.photo);

}catch(Exception e) {

e.printStackTrace();

}finally{

if(fileOutputStream !=null) {

try{

fileOutputStream.close();

}catch(Exception e) {

e.printStackTrace();

}

}

}

Toast.makeText(getApplicationContext(),"获取到了",

Toast.LENGTH_SHORT).show();

}else{

Toast.makeText(getApplicationContext(),"找不到图片",

Toast.LENGTH_SHORT).show();

}

}

}

break;

case2: {

//打开相册并选择照片,这个方式选择单张

// 获取返回的数据,这里是android自定义的Uri地址

Uri selectedImage = data.getData();

String[] filePathColumn = { MediaStore.Images.Media.DATA };

// 获取选择照片的数据视图

Cursor cursor = getContentResolver().query(selectedImage,

filePathColumn,null,null,null);

cursor.moveToFirst();

// 从数据视图中获取已选择图片的路径

intcolumnIndex = cursor.getColumnIndex(filePathColumn[0]);

String picturePath = cursor.getString(columnIndex);

cursor.close();

// 将图片显示到界面上

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

imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));

break;

}

default:

break;

}

}

}

}

 

注释的很详细,自己分析吧。

本文介绍了Android自定义漂亮的圆形进度条的教程,实现后效果很棒,大家可以动手尝试一下哦!

这几天对Android中实现画圆弧及圆弧效果中所实现的效果进行了修改,改为进度圆心进度条,效果如图所示

TasksCompletedView.java 代码如下

 

 代码如下复制代码

importandroid.content.Context;

importandroid.content.res.TypedArray;

importandroid.graphics.Canvas;

importandroid.graphics.Paint;

importandroid.graphics.RectF;

importandroid.graphics.Paint.FontMetrics;

importandroid.util.AttributeSet;

importandroid.view.View;

  

importcom.snailws.taskscompleted.R;

  

/**

* @author naiyu(http://snailws.com)

* @version 1.0

*/

publicclassTasksCompletedViewextendsView {

  

    // 画实心圆的画笔

    privatePaint mCirclePaint;

    // 画圆环的画笔

    privatePaint mRingPaint;

    // 画字体的画笔

    privatePaint mTextPaint;

    // 圆形颜色

    privateintmCircleColor;

    // 圆环颜色

    privateintmRingColor;

    // 半径

    privatefloatmRadius;

    // 圆环半径

    privatefloatmRingRadius;

    // 圆环宽度

    privatefloatmStrokeWidth;

    // 圆心x坐标

    privateintmXCenter;

    // 圆心y坐标

    privateintmYCenter;

    // 字的长度

    privatefloatmTxtWidth;

    // 字的高度

    privatefloatmTxtHeight;

    // 总进度

    privateintmTotalProgress =100;

    // 当前进度

    privateintmProgress;

  

    publicTasksCompletedView(Context context, AttributeSet attrs) {

        super(context, attrs);

        // 获取自定义的属性

        initAttrs(context, attrs);

        initVariable();

    }

  

    privatevoidinitAttrs(Context context, AttributeSet attrs) {

        TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs,

                R.styleable.TasksCompletedView,0,0);

        mRadius = typeArray.getDimension(R.styleable.TasksCompletedView_radius,80);

        mStrokeWidth = typeArray.getDimension(R.styleable.TasksCompletedView_strokeWidth,10);

        mCircleColor = typeArray.getColor(R.styleable.TasksCompletedView_circleColor,0xFFFFFFFF);

        mRingColor = typeArray.getColor(R.styleable.TasksCompletedView_ringColor,0xFFFFFFFF);

          

        mRingRadius = mRadius + mStrokeWidth /2;

    }

  

    privatevoidinitVariable() {

        mCirclePaint =newPaint();

        mCirclePaint.setAntiAlias(true);

        mCirclePaint.setColor(mCircleColor);

        mCirclePaint.setStyle(Paint.Style.FILL);

        mRingPaint =newPaint();

        mRingPaint.setAntiAlias(true);

        mRingPaint.setColor(mRingColor);

        mRingPaint.setStyle(Paint.Style.STROKE);

        mRingPaint.setStrokeWidth(mStrokeWidth);

        mTextPaint =newPaint();

        mTextPaint.setAntiAlias(true);

        mTextPaint.setStyle(Paint.Style.FILL);

        mTextPaint.setARGB(255,255,255,255);

        mTextPaint.setTextSize(mRadius /2);

        FontMetrics fm = mTextPaint.getFontMetrics();

        mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);

          

    }

  

    @Override

    protectedvoidonDraw(Canvas canvas) {

  

        mXCenter = getWidth() /2;

        mYCenter = getHeight() /2;

          

        canvas.drawCircle(mXCenter, mYCenter, mRadius, mCirclePaint);

          

        if(mProgress >0) {

            RectF oval =newRectF();

            oval.left = (mXCenter - mRingRadius);

            oval.top = (mYCenter - mRingRadius);

            oval.right = mRingRadius *2+ (mXCenter - mRingRadius);

            oval.bottom = mRingRadius *2+ (mYCenter - mRingRadius);

            canvas.drawArc(oval, -90, ((float)mProgress / mTotalProgress) *360,false, mRingPaint);//

//            canvas.drawCircle(mXCenter, mYCenter, mRadius + mStrokeWidth / 2, mRingPaint);

            String txt = mProgress +"%";

            mTxtWidth = mTextPaint.measureText(txt,0, txt.length());

            canvas.drawText(txt, mXCenter - mTxtWidth /2, mYCenter + mTxtHeight /4, mTextPaint);

        }

    }

      

    publicvoidsetProgress(intprogress) {

        mProgress = progress;

//        invalidate();

        postInvalidate();

    }

}

 

attrs.xml

 

 代码如下复制代码

    

  

    

    

    

    

  

 

本文介绍了Android实现环形进度条代码,实现后效果非常酷炫,大家可以试着把这个环形进度条加进自己的网页。

先上效果图:

自定义控件:AttendanceProgressBar

代码如下:

 

 代码如下复制代码

publicclassAttendanceProgressBarextendsView {

 // 画圆环底部的画笔

 privatePaint mCirclePaint;

 // 画圆环的画笔

 privatePaint mRingPaint;

 // 画字体的画笔

 privatePaint mTextPaint;

 // 圆形颜色

 privateintmCircleColor;

 // 圆环颜色

 privateintmRingColor;

 // 半径

 privatefloatmRadius;

 // 圆环半径

 privatefloatmRingRadius;

 // 圆环宽度

 privatefloatmStrokeWidth;

 // 圆心x坐标

 privateintmXCenter;

 // 圆心y坐标

 privateintmYCenter;

 // 字的长度

 privatefloatmTxtWidth;

 // 字的高度

 privatefloatmTxtHeight;

 // 总进度

 privateintmTotalProgress =100;

 // 当前进度

 privateintmProgress =80;

 //字体颜色

 privateintmTextColor;

 // 字体大小

 privatefloatmTextSize;

 

 publicAttendanceProgressBar(Context context, AttributeSet attrs) {

 super(context, attrs);

 // 获取自定义的属性

 initAttrs(context, attrs);

 initVariable();

 }

 

 privatevoidinitAttrs(Context context, AttributeSet attrs) {

 TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs,

  R.styleable.AttendanceProgressBar,0,0);

 mRadius = typeArray.getDimension(R.styleable.AttendanceProgressBar_radius,80);

 mStrokeWidth = typeArray.getDimension(R.styleable.AttendanceProgressBar_strokeWidth,10);

 mCircleColor = typeArray.getColor(R.styleable.AttendanceProgressBar_circleColor,0xFFFFFFFF);

 mRingColor = typeArray.getColor(R.styleable.AttendanceProgressBar_ringColor,0xFFFFFFFF);

 mTextColor = typeArray.getColor(R.styleable.AttendanceProgressBar_textColor,0xFF000000);

 mTextSize = typeArray.getDimension(R.styleable.AttendanceProgressBar_textSize,80);

 

 mRingRadius = mRadius + mStrokeWidth /2;

 }

 

 privatevoidinitVariable() {

 mCirclePaint =newPaint();

 mCirclePaint.setAntiAlias(true);

 mCirclePaint.setColor(mCircleColor);

// mCirclePaint.setStyle(Paint.Style.FILL);

 mCirclePaint.setStyle(Paint.Style.STROKE);

 mCirclePaint.setStrokeWidth(mStrokeWidth);

 

 mRingPaint =newPaint();

 mRingPaint.setAntiAlias(true);

 mRingPaint.setColor(mRingColor);

 mRingPaint.setStyle(Paint.Style.STROKE);

 mRingPaint.setStrokeWidth(mStrokeWidth);

 

 mTextPaint =newPaint();

 mTextPaint.setAntiAlias(true);

 mTextPaint.setStyle(Paint.Style.FILL);

 mTextPaint.setColor(mTextColor);

// mTextPaint.setARGB(255, 255, 255, 255);

// mTextPaint.setTextSize(mRadius / 2);

 mTextPaint.setTextSize(mTextSize);

 Paint.FontMetrics fm = mTextPaint.getFontMetrics();

 mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);

 

 }

 

 @Override

 protectedvoidonDraw(Canvas canvas) {

 

 mXCenter = getWidth() /2;

 mYCenter = getHeight() /2;

 

// canvas.drawCircle(mXCenter, mYCenter, mRadius, mCirclePaint);

 

 canvas.drawCircle(mXCenter, mYCenter, mRingRadius, mCirclePaint);

 RectF oval =newRectF();

 oval.left = (mXCenter - mRingRadius);

 oval.top = (mYCenter - mRingRadius);

 oval.right = mRingRadius *2+ (mXCenter - mRingRadius);

 oval.bottom = mRingRadius *2+ (mYCenter - mRingRadius);

 canvas.drawArc(oval, -90, ((float) mProgress / mTotalProgress) *360,false, mRingPaint);//

//   canvas.drawCircle(mXCenter, mYCenter, mRadius + mStrokeWidth / 2, mRingPaint);

//  String txt = mProgress + "%";

 String txt ="16/18";

 mTxtWidth = mTextPaint.measureText(txt,0, txt.length());

//  canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4, mTextPaint);

 canvas.drawText(txt, mXCenter - mTxtWidth /2, mYCenter + mTxtHeight /4- dipToPx(10), mTextPaint);

 txt ="出勤人数";

 mTxtWidth = mTextPaint.measureText(txt,0, txt.length());

 canvas.drawText(txt, mXCenter - mTxtWidth /2, mYCenter + mTxtHeight /4+ dipToPx(10), mTextPaint);

 }

 

 publicvoidsetProgress(intprogress) {

 mProgress = progress;

 postInvalidate();

 }

 privateintdipToPx(intdip) {

 floatscale = getContext().getResources().getDisplayMetrics().density;

 return(int) (dip * scale +0.5f * (dip >=0?1: -1));

 }

}

 

因为是自定义控件,所以在attr.xml文件定义了一些控件属性,以便在xml文件中设置这些属性

代码如下:

 

 代码如下复制代码

 <?xml version="1.0" encoding="utf-8"?>

<resources>
 <declare-styleable name="AttendanceProgressBar">
 <attr name="radius" format="dimension"/>
 <attr name="strokeWidth" format="dimension"/>
 <attr name="circleColor" format="color"/>
 <attr name="ringColor" format="color"/>
 <attr name="textColor" format="color"/>
 <attr name="textSize" format="dimension"/>
 </declare-styleable>
</resources>

 

最后,在xml文件中,可以这样使用

 

 代码如下复制代码

<com.ztd.lieyi.widget.AttendanceProgressBar

 android:layout_gravity="center"

 android:layout_width="100dp"

 android:layout_height="100dp"

 app:radius="45dp"

 app:strokeWidth="5dp"

 app:textSize="@dimen/text_16"

 app:textColor="@color/color_333333"

 app:circleColor="@color/color_d5ebfd"

 app:ringColor="@color/color_2c9df7"/>

 

这只是初步处理,使用时可以根据需求酌情处理。

安卓系统大家都知道各种手机有个子的更新安卓系统的时间,并不像苹果一样统一,那么小编今天就带来了各家厂商跟新Android 7.0的速度比较。感兴趣的朋友戳进来了解一下吧。

安卓的开放性,决定了它更新不可能像iOS那样及时,现在外媒汇总了2016年一些安卓手机厂商更新的速度,而这是以Android  7.0为考虑依据的。

哪家安卓手机厂商升级7.0快? 三联

升级最快的当属LG,这恐怕是很多人没想到的,谷歌推出Nougat后的78天,他们就给G5进行了升级,在Android  6.0的更新中,LG也是最迅速的,不到2个月就为Sprint版的G4升级了Marshmallow。

其次摩托罗拉的表现也是不错的,Verizon Moto Z和Moto Z Force   11月18日升级到了Nougat,只比谷歌发布Nougat晚了88天,而HTC的表现是,在谷歌发布Nougat 95天后,率先为HTC   10带来了升级,之后的是M9等机型,索尼跟进谷歌的速度也还可以(99天),11月29日将Xperia X   Performance升级到了Nougat,随后是Xperia XZ、Xperia X和X Compact。

中国厂商中,小米的表现最迅速,12月26日他们为小米5发布了中文版MIUI  8,比谷歌发布Nougat晚了126天,小米官方表示对于新系统除了要及时跟进外,还要确保发布稳定认真的更新包。

或许是机型太多的缘故,三星在安卓7.0的跟进上慢了不少,历时143天才发布了面向Galaxy S7和S7  Edge的正式版Nougat,而一加比谷歌发布Nougat晚131天,12月31日为一加3、3T发布了稳定版本Nougat更新包。

从更新升级速度上来说,LG、摩托罗拉、HTC和索尼表现都不错,它们都在100天内为设备升级了Nougat,当然小米的跟进速度也很快,毕竟要做更多的本地化适配。除了性价比高外,更新系统更快也是大家入手小米的一个重要原因...

标签:[!--infotagslink--]

您可能感兴趣的文章: