Android 保存使用闪光灯拍摄的图像 (Nexus 4)

2024-02-03

下面是我正在开发的自定义相机应用程序的代码。一切正常,除了使用闪光灯拍摄图像时。打开闪光灯后,预览向用户显示接受图像看起来是正确的,但保存到 SD 卡的图像非常暗(只有轻微可见的白色物体)并且通常只是黑色。我这几天一直在试图找出这个问题。有什么想法可能会发生什么吗?

public class CustomCamera extends Activity implements SurfaceHolder.Callback{
Camera camera;
Surfaceview surfaceView;
SurfaceHolder surfaceHolder;
boolean previewing = false;
LayoutInflater controlInflater = null;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.main);

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    getWindow().setFormat(PixelFormat.UNKNOWN);
    surfaceView = (SurfaceView)findViewById(R.id.camerapreview);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    ...

  }


  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    if(previewing){
        camera.stopPreview();
        previewing = false;
    }

    if (camera != null){
        try {
            Camera.Parameters parameters = camera.getParameters();              
            camera.setDisplayOrientation(90);
            determineDisplayOrientation();
            camera.setPreviewDisplay(surfaceHolder);
            previewing = true;


            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
                List<String> supportedFocusModes = parameters.getSupportedFocusModes();

                if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){
                    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
                } else{
                    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
                }

            }


            if (parameters.getSupportedWhiteBalance().contains(
                    Parameters.WHITE_BALANCE_AUTO)) {
                parameters.setWhiteBalance(Parameters.WHITE_BALANCE_AUTO);
            }

            if (parameters.getSupportedSceneModes().contains(
                    Parameters.SCENE_MODE_AUTO)) {
                parameters.setSceneMode(Parameters.SCENE_MODE_AUTO);
            }


            camera.setParameters(parameters);
            camera.startPreview();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


@Override
public void surfaceCreated(SurfaceHolder holder) {
    flashButton.setBackgroundResource(R.drawable.auto_flash);
    camera = Camera.open(CURRENT_CAMERA_ID);
    Camera.Parameters camParameters = camera.getParameters();
    flashSupported = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);


    if ( flashSupported){
        camParameters.setFlashMode(Parameters.FLASH_MODE_AUTO);
        lastFlashMode = AUTO_FLASH;
        camera.setParameters(camParameters);
    }       
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    camera.release();
    camera = null;
    previewing = false;
}

//click listener for button to take picture
public void takePicture(View view){     
    if (camera != null){
        orientationListener.rememberOrientation();
        camera.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG);
        showPicPreviewScreen();
    }

}


Camera.ShutterCallback myShutterCallback = new Camera.ShutterCallback() {

    @Override
    public void onShutter() {

    }
};

Camera.PictureCallback myPictureCallback_RAW = new Camera.PictureCallback(){

    @Override
    public void onPictureTaken(byte[] arg0, Camera arg1) {
    }
};

Camera.PictureCallback myPictureCallback_JPG = new Camera.PictureCallback(){

    @Override
    public void onPictureTaken(byte[] arg0, Camera arg1) {
        bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);


        int rotation = (displayOrientation + orientationListener.getRememberedOrientation() + layoutOrientation) % 360;
        if (rotation != 0){
            Log.e("rotaion", "not 0, rotating");
            Bitmap oldBitmap = bitmapPicture;
            Matrix matrix = new Matrix();
            matrix.postRotate(rotation);

            bitmapPicture = Bitmap.createBitmap(bitmapPicture, 0, 0, bitmapPicture.getWidth(), bitmapPicture.getHeight(), matrix, false);
            oldBitmap.recycle();
        }


        camera.stopPreview();
        previewing = false;


        ImageSaver imageSaver = new ImageSaver();
        imageSaver.saveImage(getApplicationContext(), bitmapPicture);
    }
};        

}

这是保存图像的类

public class ImageSaver{
private Context context;
private String NameOfFolder = "/ProjectFolder";

String fileName;

String file_path;
public void saveImage(Context context,Bitmap ImageToSave){
    context = context;
    file_path  = Environment.getExternalStorageDirectory().getAbsolutePath()+ NameOfFolder;
    String CurrentDateAndTime= getCurrentDateAndTime();
    File dir = new File(file_path);

    if(!dir.exists()){
        dir.mkdirs();
    }

    fileName = CurrentDateAndTime+ ".jpg";
    File file = new File(dir, fileName);

    try {
        FileOutputStream fOut = new FileOutputStream(file);
        ImageToSave.compress(Bitmap.CompressFormat.JPEG, 100, fOut);  //85
        fOut.flush();
        fOut.close();
    }
    catch (FileNotFoundException e) {UnableToSave();}
    catch (IOException e){UnableToSave();}
}


private String getCurrentDateAndTime() {
    Calendar c = Calendar.getInstance();
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
    String formattedDate = df.format(c.getTime());
    return formattedDate;
}

}

多谢!


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 保存使用闪光灯拍摄的图像 (Nexus 4) 的相关文章

  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 在 AppAuth-Android 中注销

    我有一个用JAVA开发的Android应用程序 对于这个应用程序 我使用的是身份服务器4 https github com IdentityServer IdentityServer4作为我的 STS 一切正常 但我找不到任何注销的实现Ap
  • jar 中的 apklib 有什么优点?

    我正在关注这个问题 https stackoverflow com questions 6059502 whats the difference between apklib and jar files但它并没有完全回答我的问题 jar 中
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da
  • 具有矢量可绘制的 ImageView 的 Resources$NotFoundException

    我遇到了崩溃 Resources NotFoundException用于在活动创建时绘制的矢量 21 日前崩溃 安卓工作室2 1 支持库24 0 0 Gradle插件2 1 0 目标SDK 23 最小SDK 15 buildTools版本
  • Android ADT Eclipse 插件,parseSDKContent 失败

    我刚刚设置了我的第一个 Android 开发环境 其中包括 日食3 5 Mac OS X 10 5 适用于 x86 mac 的 Android SDK ADT Eclipse 插件 0 9 6 我已将 set PATH 设置为我的 SDK
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo

随机推荐

  • HTTP 失败:java.net.SocketException:套接字关闭改造

    尝试了多种方法仍然面临这个问题 我正在使用 RxJava 和 Retrofit 来完成所有网络操作 下面是我的代码 服务 kt GET v1 contact id fun getContactDetails Path id id Strin
  • upnpx 库的 Apple Mach-O 链接器错误

    我在使用 upnpx 库时遇到一个小问题 我已经下载了该库并打开了 upnpdemo 工作区 我在同一工作区中创建了一个新项目 尝试使用该库创建一个简单的应用程序 我像演示项目一样设置参数 但是 XCode 返回 21 个错误 Apple
  • WPF:列表框取消选择

    当用户单击我的单选中的某个项目时ListBox 该项目被选中 当用户第二次单击某个项目时 除非按住 Ctrl 键 否则不会取消选择该项目 建议将 2 更改为不需要控制键的方法是什么 确保选择模式为Multiple 通过选择多个 您只需单击鼠
  • 使用 _FILES 无法将文件发送到 PHP 服务器

    我正在尝试将值发送到 PHP 服务器 但总是收到 HTTP REsponse 200 并且在我的服务器中我没有收到我发送的值 不知道问题是什么 以下是我的 android 和 PHP 代码片段 有人可以帮忙吗我用这个 抱歉代码太多 我也遵循
  • 如何在Asp.Net Mvc4中检查验证码后传递Email Id值?

    我是使用实体框架的 Asp Net Mvc4 的新手 现在我正在为忘记密码进行验证码验证 作为我的代码 当我单击提交按钮时 即使验证码无效 它也会将电子邮件 ID 值传递给控制器 如果验证码正确 我想将电子邮件 ID 值传递给控制器 否则它
  • ASP.NET 无法编译调试

    我有两台 IIS 服务器计算机 A 和 B 它们都为相同的 ASP NET Web 窗体站点提供服务 在 A 上 当我遇到错误时 我会收到详细的错误页面 其中显示生成异常的源代码 在 B 上 当我遇到错误时 我收到消息 The source
  • rspec:第一次失败后如何继续测试

    我正在使用 rspec 来系统测试设备 该设备是模块化的 因此可以将任意数量的子设备连接到测试装置 我想在很多地方编写测试 这些测试将循环连接的子设备并在每个设备上运行相同的测试 基本上 这就是我想要做的 before all tool d
  • 我应该在退出子程序之前重新打开 .CutCopyMode 吗?

    为了优化我的代码 我关闭了几个应用程序对象成员 https msdn microsoft com en us library office ff198091 aspx特性 尤其是 CutCopyMode 属性 https msdn micr
  • TypeError:使用 ReactNative 传递参数时 this.props.navigation.getParam 不是函数

    我在通过 getParam 方法访问参数时遇到错误 如下所示 const source this props navigation getParam source 0 const doFollow this props navigation
  • Service Worker 更新延迟

    我有一个正在运行的 Web 应用程序 它依靠服务工作人员来检查所有缓存的文件并确保用户使用正确的应用程序版本 我们的客户目前希望设备在特定点 重新打开应用程序时 等检查更新 因为目前当您打开应用程序时 设备最多可能需要 5 分钟才能意识到其
  • 如果包装器使用拆箱,那么 intValue() 方法需要什么?

    例如 看看这段代码 Integer myInt new Integer 5 int i1 myInt intValue int i2 myInt System out println i1 System out println i2 正如您
  • addClass 和removeClass 反应

    我想检查目标元素是否包含类 如果没有添加该类 如果是则删除该类 class Hello extends React component addActiveClass e if e target classList contains acti
  • 如何在底图中绘制圆圈或添加艺术家

    我想知道如何使用纬度和经度用底图绘制一个圆 import matplotlib pyplot as plt fig ax plt subplots ax axis 0 10 0 10 circle1 plt Circle 5 5 2 col
  • 无法读取 Kendo Pivot Grid MVC 中未定义的属性“值”

    我正在使用 Kendo Pivot Grid 当我展开行时 控制台中出现错误 无法读取属性 value 的未定义 在出现错误之前 我使用 JavaScript 刷新数据源 并且没有删除度量和维度 当我删除度量和维度并刷新数据源后 一切正常
  • 使用 itext 7 将页码文本添加到 pdf 副本中进行翻转/镜像

    所以 我一直在尝试使用 itext 文档中提供的示例来合并文档并为合并结果创建目录 但是向每个页面添加页码文本的部分并没有像我预期的那样工作 发生的情况是添加的文本在某个水平轴上翻转 如下图所示 另外 用于为添加的文本设置固定位置的方法的
  • 问题:将 12 小时制转换为 24 小时制,然后反转回来

    我是一名 C 初学者 我正在 MVP 中编写一个 Web 应用程序 但在将 12 小时时钟转换为 24 小时时钟时遇到问题 因此 有三个下拉框 小时 分钟 上午 下午 当 AM PM 下拉列表显示为 PM 时 小时值应加 12 这是我的代码
  • 如何修改 iPhone OpenGL ES 模板中的着色器以产生这种效果?

    我正在尝试修改片段着色器 它是标准 iPhone XCode OpenGL ES 模板的一部分 我想让它每隔一行像素都是透明的 到目前为止我有这个代码 varying lowp vec4 colorVarying void main gl
  • DBD::mysql 的 cpan 安装在测试中失败并且未找到符号。 OSX 莫哈韦沙漠

    这看起来好像已经存在很多年了 但我找不到任何最近的和 Mac 相关的东西 并且只处理安装 CPAN 模块 DBD mysql 我已经在互联网上搜寻了好几天了 Failed test use DBD mysql at t 00base t l
  • 如何使 pthread_cond_timedwait() 对系统时钟操作具有鲁棒性?

    考虑以下完全符合 POSIX 标准的源代码 include
  • Android 保存使用闪光灯拍摄的图像 (Nexus 4)

    下面是我正在开发的自定义相机应用程序的代码 一切正常 除了使用闪光灯拍摄图像时 打开闪光灯后 预览向用户显示接受图像看起来是正确的 但保存到 SD 卡的图像非常暗 只有轻微可见的白色物体 并且通常只是黑色 我这几天一直在试图找出这个问题 有