Android学习之调用系统相机拍照、截图并保存

原创 2015年11月18日 20:31:00

最近写一款拍照的APP用到了拍照,截图,并返回ImageView。网上找了好几种fang法,发现最好还是调用系统自带的,既简单又方便。

启用android 系统相机

intent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

启用android截图

intent = new Intent("com.android.camera.action.CROP");//动作-裁剪

下面是我的代码

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Environment;
import android.provider.MediaStore;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.net.Uri;

import android.widget.TextView;
import android.widget.Toast;
import com.soundcloud.android.crop.Crop;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;


import me.qincai.newton.R;
import me.qincai.newton.listener.NavigationFinishClickListener;
import me.qincai.newton.util.Utils;


public class MainActivity extends AppCompatActivity implements Toolbar.OnMenuItemClickListener {

    private static final int REQUEST_IMAGE_CAPTURE = 330;
    private static File photoFile;
    private static File cropFile;
    public static String crop;
    public static String crop1;
    @Bind(R.id.main_toolbar)
    protected Toolbar toolbar;

    @Bind(R.id.tv_register)
    protected TextView tv_register;

    @Bind(R.id.btn_capture)
    protected com.rey.material.widget.Button btn_capture;

    private static final int REQUEST_CROP = 332;
    public static final int REQUEST_LOGIN = 331;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        toolbar.setNavigationOnClickListener(new NavigationFinishClickListener(this));
        toolbar.inflateMenu(R.menu.menu_main);
        toolbar.setOnMenuItemClickListener(this);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    @Override
    public boolean onMenuItemClick(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        switch (id) {
            case R.id.action_user:
                if (Utils.isLogin()) {
                    Intent intent = new Intent(MainActivity.this, ProfileActivity.class);
                    startActivity(intent);
                } else {
                    Utils.loginRequired(MainActivity.this);
                }
                return true;
            case R.id.action_questions:
                Intent intent = new Intent(MainActivity.this, QuestionsActivity.class);
                startActivity(intent);
                return true;
            default:
                return false;
        }
    }
    @OnClick(R.id.btn_capture)
    public void onCapture() {
        // 未登陆则引导登陆
        if (!Utils.isLogin()) {
            Utils.loginRequired(MainActivity.this);
        } else {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (intent.resolveActivity(getPackageManager()) != null) {
                try {
                    photoFile = createImageFile();
                } catch (IOException e) {
                    Toast.makeText(this, "写入图片出错", Toast.LENGTH_SHORT).show();
                }
                if (photoFile != null) {
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
                    startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
                }
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (data == null)
        if (resultCode != RESULT_OK)
            return;
        switch (requestCode) {
            case REQUEST_IMAGE_CAPTURE:
                Uri u = Uri.fromFile(photoFile);
                cropPhoto(u);
                break;
            case REQUEST_CROP:
                Log.e("截图成功onActivityResult", "data is " + data.toString());
                handleCrop();
                break;
            case REQUEST_LOGIN:
                break;
        }
    }

    public void cropPhoto(Uri uri) {
        try {
            cropFile = createImageFile();
        }catch (IOException e)
        {
            Log.e("jianliwenjiancuowu","sedfwedf");
        }

        if (uri == null) {
            return;
        }
        Intent intent = new Intent("com.android.camera.action.CROP");//动作-裁剪
        intent.setDataAndType(uri, "image/*");//类型
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cropFile));//// 输出文件
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());// 输出格式
        intent.putExtra("crop", true);
        intent.putExtra("scale", true);// 缩放
        intent.putExtra("scaleUpIfNeeded", true);// 如果小于要求输出大小,就放大
        intent.putExtra("return-data", false);// 不返回缩略图
        intent.putExtra("noFaceDetection", true);// 关闭人脸识别
        startActivityForResult(intent,REQUEST_CROP);
    }
    private void handleCrop() {
        Intent intent = new Intent(MainActivity.this, PreviewActivity.class);
        intent.putExtra("image_cropped_file", cropFile.toString());
        startActivity(intent);
    }

    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA).format(new Date());
        String imageFileName = "QC_" + timeStamp + "_";
        File storageDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );
        // Save a file: path for use with ACTION_VIEW intents
        return image;
    }

    @OnClick(R.id.tv_register)
    protected void onRegisterClick() {
        Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
        startActivity(intent);
    }
}

这就是简单的调用系统相机,如果大家有兴趣想自定义一个相机的话,可以看一看我的这篇博客:【Android 开发】SufaceView自定义相机拍照

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。

Android中使用代码截图的各种方法总结

public class ScreenShot { private BufferedImage image = null; /** * @param args */ public sta...
  • woshinia
  • woshinia
  • 2013年09月10日 11:17
  • 126464

AutoCamera - 极简的Android拍照/相册/截图调用方法

AutoCamera可以帮你用几行代码,就完成拍照/相册/截图的API调用。
  • dingding_android
  • dingding_android
  • 2016年08月09日 11:27
  • 352

使用安卓Camera类完成视频截图功能

最近公司在VOIP视频上传的功能里加视频截图的功能。下面我来介绍一下我的实现思路和实现过程。...
  • lpnpcs
  • lpnpcs
  • 2016年03月10日 15:47
  • 2906

使用安卓Camera类完成视频截图功能

最近公司在VOIP视频上传的功能里加视频截图的功能。下面我来介绍一下我的实现思路和实现过程。...
  • lpnpcs
  • lpnpcs
  • 2016年03月10日 15:47
  • 2906

android-实现手机截屏效果,保存截屏图片

一、准备一张图片 拷贝screenshot_panel.9.png放在目录drawable-xhdpi下 二、activity_main.xml 代码如下: ...
  • loveheronly
  • loveheronly
  • 2015年04月02日 09:56
  • 4632

Android中使用代码截图的各种方法总结

public class ScreenShot { private BufferedImage image = null; /** * @param args */ public sta...
  • woshinia
  • woshinia
  • 2013年09月10日 11:17
  • 126464

android中截图并保存本地

最近项目比较紧,周六还在公司加班,需求里面有截图这个功能,于是便开始搞,网上搜了下,发现2个方法,并亲测可用,分享给大家 1、简单的屏幕截取并保存(对view截取的部分为黑的) 代码如下: pr...
  • line1213
  • line1213
  • 2015年12月05日 16:41
  • 1329

Android 截屏并保存至相册

效果演示如下,因为大小限制,gif比较短截屏后的动画模仿了Android系统自带截屏的动画 计算好坐标,就可以截取自己所需区域 主类源码如下:package sbingo.com.screensh...
  • recordGrowth
  • recordGrowth
  • 2016年08月12日 00:02
  • 2130

Android中使用代码截图的各种方法总结

 1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法。网上已经有很多的实例了。首先创建一个android projec...
  • LANGXINLEN
  • LANGXINLEN
  • 2015年10月15日 11:43
  • 1134

Android获取当前屏幕截图,简单粗暴!

获取当前屏幕截图的简单方法
  • sunluyao_
  • sunluyao_
  • 2015年12月09日 16:50
  • 3745
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android学习之调用系统相机拍照、截图并保存
举报原因:
原因补充:

(最多只允许输入30个字)