如何获得适用于 Android 的简单相机程序?

2024-01-20

我刚刚开始用 Java 编程,我需要一个简单的应用程序来显示相机、拍照并将图片数据发送到某个地方。

我一直在网上搜索,试图找到一个按预期工作的好相机教程,但显然它们都需要一些我还没有的内在知识。

On this https://stackoverflow.com/questions/2713165/take-and-save-picture-on-button-press页面上,commonsWare 指出了其中包含一些使用相机的示例代码的代码。我已经获取了 PictureDemo 代码并让它运行,没有错误。然而,它只会带来黑屏。我认为这是因为程序实际上并未激活主函数中的预览或相机,但每次我尝试添加我认为需要的代码时,我都会遇到异常。

所以我的问题是,我需要在主函数中添加什么才能让相机运行?或者是否有更好的教程,我可以看到用于启动相机的简单基本代码?

package assist.core;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MainActivity extends Activity
{
    private SurfaceView preview = null;
    private SurfaceHolder previewHolder = null;
    private Camera camera = null;
    private boolean inPreview = false;

    /**
     * 
     */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        //Call the parent class
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        preview = (SurfaceView) findViewById(R.id.preview);
        previewHolder = preview.getHolder();
        previewHolder.addCallback(surfaceCallback);
        previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void onResume() {
        super.onResume();
        //Get the camera instance
        camera = CameraFinder.INSTANCE.open();
    }

    @Override
    public void onPause() {
        if (inPreview) {
            camera.stopPreview();
        }

        camera.release();
        camera = null;
        inPreview = false;

        super.onPause();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_CAMERA || keyCode == KeyEvent.KEYCODE_SEARCH) {
            if (inPreview) {
                camera.takePicture(null, null, photoCallback);
                inPreview = false;
            }

            return(true);
        }

        return(super.onKeyDown(keyCode, event));
    }

    private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
        Camera.Size result = null;

        for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
            if (size.width <= width && size.height <= height) {
                if (result == null) {
                  result=size;
                }
                else {
                    int resultArea = result.width * result.height;
                    int newArea = size.width * size.height;

                    if (newArea > resultArea) {
                        result = size;
                    }
                }
            }
        }

        return(result);
    }

    SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
        public void surfaceCreated(SurfaceHolder holder) {
            try {
                camera.setPreviewDisplay(previewHolder);
            }
            catch (Throwable t) {
                Log.e("MainActivity-surfaceCallback", "Exception in setPreviewDisplay()", t);
                Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_LONG).show();
            }
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            Camera.Parameters parameters = camera.getParameters();
            Camera.Size size = getBestPreviewSize(width, height, parameters);

            if (size != null) {
                parameters.setPreviewSize(size.width, size.height);
                parameters.setPictureFormat(PixelFormat.JPEG);

                camera.setParameters(parameters);
                camera.startPreview();
                inPreview = true;
            }
        }

        public void surfaceDestroyed(SurfaceHolder holder) {
            // no-op
        }
    };

    Camera.PictureCallback photoCallback = new Camera.PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {
            new SavePhotoTask().execute(data);
            camera.startPreview();
            inPreview = true;
        }
    };

    class SavePhotoTask extends AsyncTask<byte[], String, String> {
        @Override
        protected String doInBackground(byte[]... jpeg) {
            File photo = new File(Environment.getExternalStorageDirectory(), "photo.jpg");
            if(photo.exists()) {
                photo.delete();
            }

            try {
                FileOutputStream fos = new FileOutputStream(photo.getPath());
                fos.write(jpeg[0]);
                fos.close();
            }
            catch (java.io.IOException e) {
                Log.e("MainActivity", "Exception in photoCallback", e);
            }

            return(null);
        }
    }
}

Update

至于我遇到的异常,如果我尝试像下面的代码那样创建 main 函数,

public void onCreate(Bundle savedInstanceState)
{
    //Call the parent class
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    preview = (SurfaceView) findViewById(R.id.preview);
    previewHolder = preview.getHolder();
    previewHolder.addCallback(surfaceCallback);
    previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    Camera.Parameters parameters = camera.getParameters();
    parameters.setPictureFormat(PixelFormat.JPEG);
    camera.setParameters(parameters);

    try {
        //Start the camera preview display
        camera.setPreviewDisplay(previewHolder);
        camera.startPreview();
    } 
    catch (IOException ex) {
        Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
    }
}

我收到“应用程序意外停止。请重试。”我基本上是试图遵循以下步骤安卓文档 http://developer.android.com/reference/android/hardware/Camera.html#setPreviewDisplay(android.view.SurfaceHolder)指定。我还尝试在检索相机对象后将此代码放入 onResume 函数中,然后调用 this.onResume。


这是一个功能齐全的相机,可与意图一起使用(我立即调用相机,您显然会包含一个按钮或菜单项)。它将图像保存到图库并以 Pic.jpg 的形式保存到根目录,然后显示捕获的图像。

这个答案是一个扩展和完整的版本Aleksander O 的这段精彩片段。 https://stackoverflow.com/a/2737770/1166727

import java.io.File;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

public class CallCameraActivity extends Activity {

    final int TAKE_PICTURE = 1;
    private Uri imageUri;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        takePhoto();
    }



    public void takePhoto() {
        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        File photo = new File(Environment.getExternalStorageDirectory(),  "Pic.jpg");
        intent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.fromFile(photo));
        imageUri = Uri.fromFile(photo);
        startActivityForResult(intent, TAKE_PICTURE);
    }
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
    case TAKE_PICTURE:
        if (resultCode == Activity.RESULT_OK) {
            //Uri imageUri;
            Uri selectedImage = imageUri;
            getContentResolver().notifyChange(selectedImage, null);
            ImageView imageView = (ImageView) findViewById(R.id.IMAGE);
            ContentResolver cr = getContentResolver();
            Bitmap bitmap;
            try {
                 bitmap = android.provider.MediaStore.Images.Media
                 .getBitmap(cr, selectedImage);

                imageView.setImageBitmap(bitmap);
                Toast.makeText(this, "This file: "+selectedImage.toString(),
                        Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT)
                        .show();
                Log.e("Camera", e.toString());
            }
        }
    }
}
}

使用它作为您的 main.xml 布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />


    <ImageView
        android:id="@+id/IMAGE"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

</LinearLayout>

字符串.xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
  <string name="hello">Hello World, TonyPicturesInc!</string>
  <string name="app_name">TGCam</string>
</resources>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获得适用于 Android 的简单相机程序? 的相关文章

  • 通知声音不适用于 api 10 android

    我用这个功能来显示状态notification 一切正常 但没有声音播放notification public void notifiction main String ticker String title String text int
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 带有 backstack Resume 的嵌套片段

    在我的应用程序中有几个fragments in an activity我正在维护一个backStack对于这些fragment 一切都很好 但其中有一个嵌套的片段 当我把它放入backStack然后再次按后退按钮恢复 该片段看起来与先前的内
  • Java Applet 中的 Apache FOP - 未找到数据的 ImagePreloader

    我正在研究成熟商业产品中的一个问题 简而言之 我们使用 Apache POI 库的一部分来读取 Word DOC 或 DOCX 文件 并将其转换为 XSL FO 以便我们可以进行标记替换 然后 我们使用嵌入到 Java 程序中的 FOP 将
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • 以编程方式向 LinearLayout 添加边框

    我该如何添加以编程方式LinearLayout 的边框 假设我们创建了这个布局 LinearLayout TitleLayout new LinearLayout getApplicationContext TitleLayout setO
  • Spring @Cacheable 和 @Async 注解

    我需要缓存一些异步计算的结果 具体来说 为了克服这个问题 我尝试使用 Spring 4 3 缓存和异步计算功能 作为示例 我们采用以下代码 Service class AsyncService Async Cacheable users C
  • 找不到数据库路径是不可能的

    我对 android 开发很陌生 现在我正在尝试通过扩展 SQLiteOpenHelper 的类创建数据库 我确信数据存储在我的 Nexus 7 我用来测试应用程序的设备 上的某个位置 但是我找不到数据库的路径 我四处寻找其他类似的问题 所
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 在 Spring 上下文中查找方法级自定义注释

    我想知道的是 所有的类 方法Spring http en wikipedia org wiki Spring Framework注释为 Versioned的bean 我创建了自定义注释 Target ElementType METHOD E
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • android系统用户和linux root用户有什么区别

    当我将手机连接到电脑并使用adb shell与我的手机通信并输入的命令ps命令输出当前在我的手机上运行的进程信息 我发现有两个特殊用户 一个是root 另一个是system 据我所知 Android是基于linux的 所以root用户是最大
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • 如何解决 greenDAO 在执行 InsertOrReplace 时“不存在这样的表错误”?

    我正在使用 greenDAO 并且已成功生成所有必需的类和实体 并且我可以看到我的表已创建 但是在要替换的行上放置断点后 我收到一条错误消息 告诉我 不存在这样的表错误 try appTimeUsageDao insertOrReplace
  • 如何在android中安装和使用couch db

    我应该如何在 android 中安装和使用 couch Db 我的意思是本地沙发数据库 我可以在平板电脑和模拟器中使用它 为此我必须遵循哪些步骤 我目前正在开发一个使用它的项目 有两种选择 1 couchbase android 是的 co
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v

随机推荐

  • Rails 邮件程序预览无法从规范/邮件程序/预览中获得

    我希望能够在浏览器中预览我的电子邮件 我正在使用 Rspec 并在 spec mailers previews 中有以下预览设置 Preview all emails at http localhost 3000 rails mailers
  • getFilesDir() 与 Environment.getDataDirectory() [重复]

    这个问题在这里已经有答案了 我想用环境变量替换一种上下文方法 但不确定它们的意思是否相同 有什么区别 getFilesDir and Environment getDataDirectory 我怎样才能得到data data作为来自data
  • Java:通过_happens-before_关系在最终类的构造函数中安全地“泄漏”this-引用?

    Goetz 的 Java Concurrency in Practice 第 3 2 1 节包含以下规则 不允许this施工期间逃生参考 我理解 一般来说 允许this转义可能会导致其他线程看到对象的不完整构造版本并违反初始化安全保证fin
  • Emacs。头盔包。如何查找文件夹(不是 git 文件夹)和所有子文件夹中的文件?

    Windows 10 64 位 Emacs 25 1 Helm 包 查找文件 例如我的文件 txt 在任何文件夹 不是 git 不是项目文件 中我使用命令helm 查找文件 是工作 好的 但现在我需要找到我的文件 txt在当前文件夹和所有子
  • JavaScript 中多种情况的 switch 语句

    我需要在 JavaScript 中的 switch 语句中使用多种情况 例如 switch varName case afshin saeed larry alert Hey break default alert Default case
  • 从 hibernate 迁移到普通 jdbc

    我最近开始从事 Java 和 J2EE 工作 并且具备 JDBC 和 hibernate 相关概念的理论知识 我的工作任务是将现有的 Hibernate 连接转换为普通 JDBC 任何人都可以建议最简单的方法来做到这一点 实际上 我必须处理
  • 查询为给定事件类型注册的事件侦听器列表

    有没有一种方法可以识别 JavaScript 中给定事件的注册侦听器列表 如果可以 您可以列出示例吗 不是一般情况下 仅当您自己在代码中跟踪所有事件侦听器时才能执行此操作 最简单的方法是对所有事件侦听器分配使用包装函数 如果其中一个大型图书
  • Objective-C KVO 不适用于 C 联合

    我需要使用 KVO 观察 Objective C 类上的联合类型属性 但似乎我对此没有运气 我做了一些实验 只要我使用 C 结构 一切都会正常 一旦我用联合替换结构 自动 KVO 就不再工作了 observeValueForKeyPath没
  • 异步加载脚本

    我正在使用 JQuery 中的几个插件 自定义小部件和其他一些库 结果我有几个 js 和 css 文件 我需要为我的网站创建一个加载程序 因为加载需要一些时间 如果我可以在导入所有内容之前显示加载程序 那就太好了 etc 我找到了几个教程
  • 失败时漂亮打印数组

    describe Rspec do it should print arrays in a readable manner do arr 0 a 1 1 b 2 2 c 3 3 d 4 4 e 5 6 g 7 7 h 8 8 i 9 arr
  • 为什么Java编译器11使用invokevirtual来调用私有方法?

    当使用 OpenJDK 8 中的 Java 编译器编译以下代码时 调用foo 是通过一个完成的invokespecial 但是当使用 OpenJDK 11 时 invokevirtual被发射 public class Invoke pub
  • 两个java源文件的结构差异

    有没有办法找到两个java源文件的结构差异 我想找到两个java文件的结构差异 但我不知道如何开始 java中有没有用于此目的的库 更新 结构差异意味着像 它不关心空白或位置 它应该在语法上比较源 这有助于我们跟踪实际的更改 即使方法被移动
  • 安卓|使用 Retrofit2 和本地 API 进行基本身份验证

    我开始制作一个应用程序 并首先将其连接到模拟 API 现在我想将其连接到在我的 PC 上运行的 API For starters I m trying to implement the login access Since my API s
  • 在 JavaScript 中将 png/jpg 转换为 .ico

    所以我想要一个工具来生成 ico来自 jpg png 的文件 我使用以下代码从画布生成了 jpg var img c toDataURL image png document write img src 取自此画布
  • 如何更改 flutter showAboutDialog 中的文本按钮颜色?

    我正在使用showAboutDialogflutter 中的函数显示我的项目中使用的许可证 我如何坚持改变文本颜色VIEW LICENSES and CLOSE文本按钮 请参阅此图片以进行说明 这是我的代码 onTap showAboutD
  • 如何在离开和返回 HTTPS 页面时保留更改的表单内容? (适用于 HTTP)

    在文本区域中输入 更改某些内容 在提交表单之前 请离开页面 例如通过单击浏览器的后退按钮 返回编辑页面 例如 单击前进按钮 预期结果 在textarea中输入的内容应该仍然存在 实际结果 with HTTPS 所有的改变都消失了 bad w
  • MongoDB无尽查找ToListAsync

    我正在尝试从 MongoDB 集合中检索数据 但是发生了一些奇怪的事情 如果我显示 MessageBox 则数据获取有效 如果不显示 则数据获取无效 static class MongoDBController static MongoCl
  • Obj-C Cocoa 通知 NSApplicationDidResignActiveNotification

    我有一个名为 AppController h m 的类 我想在发送 NSNotificationDidResignActiveNotification 时做一些事情 所以我在AppController m中编写了这段代码 void init
  • CNN - 图像调整大小 VS 填充(是否保持纵横比?)

    虽然人们在训练 CNN 时通常倾向于简单地将任何图像调整为正方形 例如 resnet 采用 224x224 正方形图像 但这对我来说看起来很难看 尤其是当长宽比不在 1 左右时 事实上 这可能会改变基本事实 例如 专家可能给扭曲图像的标签可
  • 如何获得适用于 Android 的简单相机程序?

    我刚刚开始用 Java 编程 我需要一个简单的应用程序来显示相机 拍照并将图片数据发送到某个地方 我一直在网上搜索 试图找到一个按预期工作的好相机教程 但显然它们都需要一些我还没有的内在知识 On this https stackoverf