You need to enable JavaScript to run this app.
最新活动
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

没有预览和用户交互的情况下拍照是可能的吗?

在没有预览和用户交互的情况下拍照是可能的。下面是一个使用Android Camera2 API拍照的示例代码:

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.TotalCaptureResult;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.Image;
import android.media.ImageReader;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import android.util.Size;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private static final int REQUEST_CAMERA_PERMISSION = 200;

    private TextureView textureView;
    private Button captureButton;

    private CameraManager cameraManager;
    private String cameraId;
    private CameraDevice cameraDevice;
    private CameraCaptureSession cameraCaptureSession;
    private CaptureRequest.Builder captureRequestBuilder;
    private Size imageDimension;
    private ImageReader imageReader;
    private File file;
    private boolean flashSupported;
    private Handler backgroundHandler;
    private HandlerThread backgroundThread;

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

        textureView = findViewById(R.id.textureView);
        captureButton = findViewById(R.id.captureButton);

        captureButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                takePicture();
            }
        });

        cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        try {
            cameraId = cameraManager.getCameraIdList()[0];
            CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
            StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
            assert map != null;
            imageDimension = map.getOutputSizes(SurfaceTexture.class)[0];

            //检查相机权限
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
                return;
            }
            cameraManager.openCamera(cameraId, stateCallback, null);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice camera) {
            cameraDevice = camera;
            createCameraPreview();
        }

        @Override
        public void onDisconnected(@NonNull CameraDevice camera) {
            cameraDevice.close();
        }

        @Override
        public void onError(@NonNull CameraDevice camera, int error) {
            cameraDevice.close();
            cameraDevice = null;
        }
    };

    private final ImageReader.OnImageAvailableListener imageReaderListener = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
            backgroundHandler.post(new ImageSaver(reader.acquireNextImage()));
        }
    };

    private class ImageSaver implements Runnable {

        private final Image image;

        public ImageSaver(Image image) {
            this.image = image;
        }

        @Override
        public void run() {
            ByteBuffer buffer = image.getPlanes()[0].getBuffer();
            byte[] bytes = new byte[buffer.remaining()];
            buffer.get(bytes);

            FileOutputStream output = null;
            try {
                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
                String fileName = "IMG_" + timeStamp + ".jpg";
                File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
                file = new File(directory, fileName);
                output = new FileOutputStream(file);
                output.write(bytes);
                Toast.makeText(MainActivity.this, "保存成功 " + file.getAbsolutePath(), Toast.LENGTH_SHORT).show();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                image.close();
                if (output != null) {
                    try {
                        output.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    private void createCameraPreview() {
        try {
            SurfaceTexture texture =
本文内容通过AI工具匹配关键字智能整合而成,仅供参考,火山引擎不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系service@volcengine.com进行反馈,火山引擎收到您的反馈后将及时答复和处理。
展开更多
面向开发者的云福利中心,ECS 60元/年,域名1元起,助力开发者快速在云上构建可靠应用

社区干货

深度解读 Android 14 重要的 8 个新特性|社区征文

需要注意的是,该 API **只能监听电源键方式发起的截屏时机,无法监听到 adb、代码等方式发起的截屏**,毕竟它不算是用户的操作。而且不会将截图带过来,App 如果需要图片数据的话,仍需要去读取。相关文章推荐:[Andr... 默认情况下这是无高亮。![picture.image](https://p6-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/0e0cd59cdcd747faadb237acb1885ded~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1715098...

能力爆料箱 | 9个运营能力,带你玩转抖音小程序!

与小程序绑定成功的抖音号在小程序内就可以使用拍摄拍摄视频,发布时可挂载该小程序,用户在浏览短视频时就可以看到小程序锚点,并进入小程序相关页面。![picture.image](https://p3-volc-community-sign.byteimg... 引导用户授权相关信息,用户同意后即可吊起拍摄拍摄视频,拍摄后可直接发布至抖音,交互链路如下图所示;需要注意的是:- 拍摄器仅可由用户手动触发,不可自动触发;- 调起拍摄器可设置自定义参数,用户默认预览自...

State Migration on Flink SQL

能够帮助用户快速开发流式任务,支持实时数据处理的场景和需求,本文将分享 SQL 作业迭代中状态的保持——状态迁移相关的现状、问题解决及未来规划。作者|字节跳动基础架构工程师-周伊莎 # 背 景Flink SQL... 问题二是 **State serializer 不可兼容**。在 SQL 任务中,Flink 版本不变的情况下,相同的算子使用的 State 类型是一致的,例如,GroupAggregate 算子里会存一个 ValueState,这个 valueState 里面存的是一个由所有 Ac...

三掌柜的2023年国产AI体验之路|社区征文

2023年的技术圈引爆全圈的当属大模型和生成式AI了,在短短的一年时间里,几乎各行各业都被AI所渗透,对于开发者而言,正在经历一场由生成式AI带来的开发方式的革新。作为开发者的我,同样是没有“逃过”AI的“魔掌”,在... 会有一个同意用户协议的提示,阅读并接受,点击“同意并继续”按钮进入。![picture.image](https://p6-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/44759d8f99804bd7b63aa707e46dace8~tplv-tlddhu82om-im...

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

没有预览和用户交互的情况下拍照是可能的吗?-优选内容

深度解读 Android 14 重要的 8 个新特性|社区征文
需要注意的是,该 API **只能监听电源键方式发起的截屏时机,无法监听到 adb、代码等方式发起的截屏**,毕竟它不算是用户的操作。而且不会将截图带过来,App 如果需要图片数据的话,仍需要去读取。相关文章推荐:[Andr... 默认情况下这是无高亮。![picture.image](https://p6-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/0e0cd59cdcd747faadb237acb1885ded~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1715098...
能力爆料箱 | 9个运营能力,带你玩转抖音小程序!
与小程序绑定成功的抖音号在小程序内就可以使用拍摄拍摄视频,发布时可挂载该小程序,用户在浏览短视频时就可以看到小程序锚点,并进入小程序相关页面。![picture.image](https://p3-volc-community-sign.byteimg... 引导用户授权相关信息,用户同意后即可吊起拍摄拍摄视频,拍摄后可直接发布至抖音,交互链路如下图所示;需要注意的是:- 拍摄器仅可由用户手动触发,不可自动触发;- 调起拍摄器可设置自定义参数,用户默认预览自...
State Migration on Flink SQL
能够帮助用户快速开发流式任务,支持实时数据处理的场景和需求,本文将分享 SQL 作业迭代中状态的保持——状态迁移相关的现状、问题解决及未来规划。作者|字节跳动基础架构工程师-周伊莎 # 背 景Flink SQL... 问题二是 **State serializer 不可兼容**。在 SQL 任务中,Flink 版本不变的情况下,相同的算子使用的 State 类型是一致的,例如,GroupAggregate 算子里会存一个 ValueState,这个 valueState 里面存的是一个由所有 Ac...
漫谈开源许可证:开发者需要知道的法理和事例
但其仍然是为 Epic 公司所有的专有软件,用户没有开源许可证通常会授予的再分发、专利等方面的相关权利。* **Free (Libre) software ≠ Open source**从官方定义上看自由软件和开源软件都是源码可得的,将两者... 那么这个应用是不需要在分发时开放源代码的。LGPL 许可证最初是为了支持 GNU C 库抢占市场而创建的,所以相比于 GPL 提供了更宽松的许可条件:使用普通 GPL 并非对每个函数库都有好处。在某些情况下,使用 LGP...

没有预览和用户交互的情况下拍照是可能的吗?-相关内容

观点|词云指北(上):谈谈词云算法的发展

并为点和点之间添加边,即可使用力导向模型对单词进行布局。不同单词之间的力的大小可以编码降维后的高维数据,例如语义数据,所以力导向排布多用于语义词云中应用。三种算法的详细例子将在后文中介绍。03 - 交互方式常见的支持客制化的词云工具是用户通过对参数的调整(如单词朝向、颜色)等方式影响词云的结果,除了这种生成参数设定的情况外,也有论文支持用户通过交互来修改词云的布局。其交互方式形式比较多样,但...

Go 生态下的字节跳动大规模微服务性能优化实践

世上没有完美的事物。从性能角度来看,微服务也为字节跳动基础架构团队带来了两个性能代价:**通信代价** ,不同服务之间通过网络进行通信,用户必须压缩数据包,将其变成与平台、语言无关的协议发送出去,由对方解码之后... 停止执行时按下暂停,最后将数据合并。下图展示了数据的流向,我们需要从业务集群拉取业务数据,同时可能还需要和监控系统、运维系统进行交互。![picture.image](https://p3-volc-community-sign.byteimg.com/to...

干货 | 如何打造企业专属A/B平台?火山引擎DataTester开放平台技术揭秘

还可以进行复杂的数据交互,将它们的 Web 网站转换为与操作系统等价的开发平台。**第三方开发者可以基于这些已经存在的、公开的 Web 网站而开发丰富多彩的应用。** 到此为止,我觉得对于开放平台的解释就... 在这个背景下,火山引擎A/B测试 DataTester 推出了“开放平台”能力,**致力于将企业个性化需求的共性抽取出来,然后在共性的基础上满足个性化诉求,**通过成熟的产品化能力,大大降低企业服务的应用成本并提升用户使...

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

SaaS-发版日志(2024年前)

管理员可以通过操作日志明确用户对系统的变更,从而保证系统的数据安全,满足IT审计要求。 指标管理:统一管理在事件分析等分析模块中保存的指标。 功能三: 看板优化 批量升级看板 功能描述:支持在看板与看板中心,对单或多个看板进行批量升级。升级后支持试用看板“编辑态”模式。功能配图: 编辑态支持草稿箱功能 功能描述:对未保存(如过期再登陆,未保存退出)的看板,再次访问时,可恢复编辑未保存状态。功能配图: 2023年05月30日...

浅谈分布式操作系统 KubeWharf 的第二批开源项目|社区征文

在保证扩缩容时不产生非预期迁移的情况下,使最终分发尽量趋近于权重分布。- 支持原生资源:为了解决这个问题,无缝支持原生资源,KubeAdmiral 提供了 status 汇聚的能力,Status Aggregator 将多个成员集群中资源的 status 进行合并与融合,并写回原生资源,让用户无需感知多集群拓扑,就可以一目了然地观测到资源在整个联邦中的状态。## kelemetryKelemetry 是字节跳动开发的用于 Kubernetes 控制平面的追踪系统,它从全局视角串...

干货|字节跳动数据血缘图谱升级方案设计与实现

精心打磨图分析产品中常用布局和交互,帮助用户快速搭建关系图产品。血缘图谱解决方案已沉淀到 xGraph 为更多团队复用。> > > > ![picture.image](https://p3-volc-community-sign.byteimg.com/to... 我们需要去找出旧版血缘图谱提供的功能为什么不满足用户需求,有哪些问题需要在新版中注意避免。* **概览:**在数据量较小的情况下可用,在数据量大的时候完全不可用。看不清每层有多少个节点,层级关系是怎么样的...

基于迁移学习的基础设施成本优化框架,火山引擎数智平台与北京大学联合论文被KDD收录

是数据挖掘领域历史最悠久、影响最大的顶级学术年会。KDD广泛的交叉学科性和应用性吸引了来自统计、机器学习、数据库、万维网、生物信息学、多媒体、自然语言处理、人机交互、社会网络计算、高性能计算及大数据挖掘... 终端用户经验不足等问题,相当数量的计算资源常因不合理的配置而被浪费。 传统上,有经验的大数据工程师可以依据每个任务的运行情况,对其配置进行人工分析和调整。然而,这种人工调优方式在面临在高维参...

RTC 技术的试金石:火山引擎视频会议场景技术实践

第三组是白天逆光场景,这种场景的背景很亮,普通 AE 给的曝光就会不足,人脸会显得非常黑,而使用 FaceAE 优化过的相机效果就会比较亮,五官也能看清晰;第四组是室内侧光场景,这种场景照出来很容易阴阳脸,可以看到左边图上一半的脸都是黑的,眼睛都看不见在哪儿,而右边虽然不可避免还是存在阴阳脸,但画面更亮,五官都能看清了。以上是我们仅仅靠相机采集优化的效果,在没有开启任何美颜算法的情况下,就能达到比较理想的画质效果。而且...

AI 浪潮之下,前端的路究竟该怎么走|社区征文

我将会站在前端的角度通过目前AI与前端的现状来分析一下在未来 AI 会给我们带来什么样的机会与挑战。## 自动化生成代码对于我们开发者而言,实际上有很多场景都是有业内比较成熟的解决方案的,我们可以通过训练 ... 如下图这个例子,这个用户通过描述让 AI 帮他制作了一个类似推特的一个信息卡片。你还可以通过手动修改代码来预览效果,不得不说实现的效果还是很优秀的。![picture.image](https://p3-volc-community-sign.byteimg...

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

产品体验

体验中心

云服务器特惠

云服务器
云服务器ECS新人特惠
立即抢购

白皮书

一图详解大模型
浓缩大模型架构,厘清生产和应用链路关系
立即获取

最新活动

爆款1核2G共享型服务器

首年60元,每月仅需5元,限量秒杀
立即抢购

火山引擎增长体验专区

丰富能力激励企业快速增长
查看详情

数据智能VeDI

易用的高性能大数据产品家族
了解详情

一键开启云上增长新空间

立即咨询