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

简介: 版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/49912643 最近写一款拍照的APP用到了拍照,截图,并返回ImageView。
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/49912643

最近写一款拍照的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自定义相机拍照

相关文章
|
5月前
|
Android开发
Android调用相机与相册的方法1
Android调用相机与相册的方法
74 0
|
5月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
147 0
|
28天前
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
第一个安卓项目 | 中国象棋demo学习
|
10天前
|
Web App开发 编解码 视频直播
视频直播技术干货(十二):从入门到放弃,快速学习Android端直播技术
本文详细介绍了Android端直播技术的全貌,涵盖了从实时音视频采集、编码、传输到解码与播放的各个环节。文章还探讨了直播中音视频同步、编解码器选择、传输协议以及直播延迟优化等关键问题。希望本文能为你提供有关Andriod端直播技术的深入理解和实践指导。
15 0
|
1月前
|
Android开发
Android学习 —— 测试init.rc中的条件触发的处理顺序
Android学习 —— 测试init.rc中的条件触发的处理顺序
|
5月前
|
监控 Unix 应用服务中间件
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
Android-音视频学习系列-(八)基于-Nginx-搭建(rtmp、http)直播服务器
|
5月前
|
Java Android开发
Android12 双击power键启动相机源码解析
Android12 双击power键启动相机源码解析
167 0
|
2月前
|
搜索推荐 Android开发
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
本文分享了不同价位电脑配置对于编译AOSP安卓系统源代码的影响,提供了从6000元到更高价位的电脑配置实例,并比较了它们的编译时间,以供学习AOSP源代码时电脑配置选择的参考。
176 0
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
|
2月前
|
测试技术 API Android开发
Android经典实战之简化 Android 相机开发:CameraX 库的全面解析
CameraX是Android Jetpack的一个组件,旨在简化相机应用开发,提供了易于使用的API并支持从Android 5.0(API级别21)起的设备。其主要特性包括广泛的设备兼容性、简洁的API、生命周期感知、简化实现及方便的集成与测试。通过简单的几个步骤即可实现如拍照、视频录制等功能。此外,还提供了最佳实践指导以确保应用的稳定性和性能。
50 0
|
5月前
|
存储 定位技术 开发工具
Android 开发前的设计,Android之内存泄漏调试学习与总结
Android 开发前的设计,Android之内存泄漏调试学习与总结