Android 将图像保存到 SD 卡

2024-01-26

UPDATE

Added

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

到清单现在一切正常。

好吧,我已经开始创建一个应用程序,最终我希望能够拍照,然后它会将您带到另一个屏幕,让您能够“使用”或“重新拍摄”照片。

拍摄图像后,需要将其保存到 SD 卡上的新文件夹中(如果该文件夹不存在,则需要创建它)。几周前我已经完成了所有这些工作,但是在我做了一些编辑并关闭 Eclipse 之后,我似乎无法让它恢复工作?

此部分位于之后int imageNum = 0;我已经添加了imagesFolder.mkdirs();我相信创建一个新文件夹是正确的,但即使这样现在似乎也不起作用。

现在,图像刚刚被拍摄,既没有创建新文件夹,也没有保存图像。

public class AndroidCamera extends Activity implements SurfaceHolder.Callback {

Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean previewing = false;
LayoutInflater controlInflater = null;

final int RESULT_SAVEIMAGE = 0;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    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);

    controlInflater = LayoutInflater.from(getBaseContext());
    View viewControl = controlInflater.inflate(R.layout.control, null);
    LayoutParams layoutParamsControl = new LayoutParams(
            LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    this.addContentView(viewControl, layoutParamsControl);

    Button buttonTakePicture = (Button) findViewById(R.id.takepicture);
    buttonTakePicture.setOnClickListener(new Button.OnClickListener() {

        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            camera.takePicture(myShutterCallback, myPictureCallback_RAW,
                    myPictureCallback_JPG);

        }
    });
}

ShutterCallback myShutterCallback = new ShutterCallback() {

    public void onShutter() {
        // TODO Auto-generated method stub

    }
};

PictureCallback myPictureCallback_RAW = new PictureCallback() {

    public void onPictureTaken(byte[] arg0, Camera arg1) {
        // TODO Auto-generated method stub

    }
};

PictureCallback myPictureCallback_JPG = new PictureCallback(){

    public void onPictureTaken(byte[] arg0, Camera arg1) {
        // TODO Auto-generated method stub
        /*Bitmap bitmapPicture 
            = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);  */


        int imageNum = 0;
        Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        File imagesFolder = new File(Environment.getExternalStorageDirectory(), "BeatEmUp");
        imagesFolder.mkdirs(); 
        String fileName = "image_" + String.valueOf(imageNum) + ".jpg";
        File output = new File(imagesFolder, fileName);
        while (output.exists()){
            imageNum++;
            fileName = "image_" + String.valueOf(imageNum) + ".jpg";
            output = new File(imagesFolder, fileName);
        }
        Uri uriSavedImage = Uri.fromFile(output);
        imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);


        OutputStream imageFileOS;
        try {
            imageFileOS = getContentResolver().openOutputStream(uriSavedImage);
            imageFileOS.write(arg0);
            imageFileOS.flush();
            imageFileOS.close();

            Toast.makeText(AndroidCamera.this, 
                    "Image saved: ", 
                    Toast.LENGTH_LONG).show();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        camera.startPreview();
    }};


public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub
    if (previewing) {
        camera.stopPreview();
        previewing = false;
    }

    if (camera != null) {
        try {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
            previewing = true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub

    camera = Camera.open();
    try {
        Camera.Parameters parameters = camera.getParameters();
        if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
            // This is an undocumented although widely known feature
            parameters.set("orientation", "portrait");
            // For Android 2.2 and above
            camera.setDisplayOrientation(90);
            // Uncomment for Android 2.0 and above
            parameters.setRotation(90);
        } else {
            // This is an undocumented although widely known feature
            parameters.set("orientation", "landscape");
            // For Android 2.2 and above
            camera.setDisplayOrientation(0);
            // Uncomment for Android 2.0 and above
            parameters.setRotation(0);
        }
        camera.setParameters(parameters);
        camera.setPreviewDisplay(holder);
    } catch (IOException exception) {
        camera.release();

    }
    camera.startPreview();

}

public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    camera.stopPreview();
    camera.release();
    camera = null;
    previewing = false;
}
}

您应该确保清单列出了写入 SD 卡的权限:

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

Android 将图像保存到 SD 卡 的相关文章

随机推荐

  • WPF滑块问题

    我在旧的 win32 应用程序上看到过这种行为 当您在滑块轨道上的某个位置 除了拇指上 按住鼠标时 拇指会移动到该位置 在 WPF 中 似乎发生的是拇指移动由 SmallChange 或 LargeChange 定义的距离 如果保持按住 它
  • 向 CardFragment 添加额外的图像/图标 (Android Wear)

    我正在查看来自 Google 的示例图像 并试图找出如何实现这样的东西 看起来与标准非常相似CardFragment带有标题 描述和图标的布局 但我在左侧看到了额外的时钟图像 动画 这让我认为他们使用了自定义布局 这可以用标准来实现吗Car
  • 出现“发生分段错误”的错误

    我在文件 4 中写入了一些值 我需要它们再次调用进行新计算 但我在读取行 read 4 NNrow I Niz I NNbin I Nfi I NfiStdDev I NfiAvr I NMagbin I Nzup I 当我想运行代码时 我
  • 简单的 jQuery Ajax 调用会泄漏 Internet Explorer 中的内存

    我创建了一个每秒进行一次 Ajax 调用的网页 在 Internet Explorer 7 中 内存泄漏严重 大约 15 分钟内泄漏 20 MB 该程序非常简单 它只是运行一个进行 Ajax 调用的 JavaScript 函数 服务器返回一
  • Windows 上的 Meteor JS,支持 iOS 和 Android

    我想知道 Windows 版本的 Meteor JS 是否支持开发和运行 iOS 和 或 Android 应用程序 我希望它至少支持Android 2016 年 2 月 现在适用于版本 1 3 cordova beta 5 您必须手动安装
  • 存储“派生”值与在提取时计算它们

    当您的值仅取决于一个或多个其他字段 常量 例如零售价和折扣价 时 是否最好也存储这些值或在检索数据时 即时 计算它们 默认不存储冗余信息 第三范式 http en wikipedia org wiki Third normal form通常
  • Perl 中“一维”哈希相对于数组的优势

    我只是想知道在一维数组上使用一维哈希 即只有键 没有值 无论如何我们不关心它们 的效率 我想为此目的使用哈希的主要原因是这样我可以使用存在函数来查看 条目 是否已经存在 哈希值对于不重复密钥也很有用 对吗 对于数组 我需要设置自己的涉及 g
  • 将日期转换为时间戳的问题,Spark 日期从 unix_timestamp 转换为时间戳返回 null

    将日期转换为时间戳时出现问题 Spark 日期从 unix timestamp 转换为时间戳返回 null scala gt import org apache spark sql functions unix timestamp scal
  • 将我的 ASP.NET MVC Web 应用程序发布到 IIS 后,无法上传内容文件夹内的文件

    我有以下操作方法 它将上传的文件添加到文件夹中 if ModelState IsValid string ADusername User Identity Name Substring User Identity Name IndexOf
  • 2 个 3D 点之间的偏航和俯仰

    我有 2 个 3D 点 我需要获取它们之间的偏航和俯仰弧度 我已经尝试了很多公式 但它不起作用 我的坐标系如下 X left right Y forward backward Z up down 有什么帮助吗 请具体说明 我真的很感激整个公
  • syslog-ng 读取文件权限被拒绝

    我需要通过 Syslog ng 发送 tomcat Catalina out 日志内容 但是 但重新启动 Syslog 服务后 出现权限被拒绝错误 那么我如何授予 Syslog ng 的读取权限以从 CATALINA out 读取 tomc
  • java中的排列迭代器

    我想要一个类 它接受一个正整数并生成一个迭代器 让我迭代该正整数下的正数列表的所有可能的排列 例如 模拟器 p paermulator 3 p next gt 0 1 2 p next gt 0 2 1 p next gt 1 0 2 p
  • 如何使用 smtplib 和 Python 保持 SMTP 连接打开?

    我需要检查 SMTP 服务器的超时 但我的套接字刚刚关闭 我究竟做错了什么 这是我的测试 usr bin python import smtplib import time import datetime import socket soc
  • 查找二进制文件的版本

    有谁知道如何找到已传递给我的函数的二进制文件的版本 我从以下代码中得到了这一页 http www linuxquestions org questions programming 9 reading binary file in pytho
  • 在 Zend HeadScript 视图助手中修改堆栈

    我正在尝试攻击这个问题 https stackoverflow com questions 2253170 zend framework last code to execute before layout is rendered从完全不同
  • 在 JUnit 测试类中哪里配置 log4j?

    看看我写的最后一个 JUnit 测试用例 我在类构造函数中调用了 log4j 的 BasicConfigurator configure 方法 这对于仅从 Eclipse 的 作为 JUnit 测试用例运行 命令运行单个类来说效果很好 但我
  • 当用户在文本框中键入值时,在另一个文本框中显示一个文本框值

    当用户在文本框中输入值时 是否有一种方法可以从一个文本框中获取值并使用 jQuery 动态地将其添加到另一个文本框中 如果有这样的事情 有人可以解释一下该方法吗 问候 兰加纳 你的意思是像http jsfiddle net ZLr9N ht
  • 在多层架构中通过层传递业务实体

    目前我正在开发一个利用多层架构的项目 如中所述应用架构指南2 0 http apparch codeplex com 有 5 层 DAL BLL Facade 表示层和公共层 这里我们有一个业务逻辑层 它由业务组件和业务实体 它们是使用 O
  • 切换到另一个分支而不更改工作区文件

    我从 GitHub 克隆了一个 git 存储库 做了一些更改和一些提交 我做了很多 而且都很脏 所以它们不适合拉请求 现在我创建了分支cleanchanges from origin master 所以它很干净 我想将我的更改作为一次提交提
  • Android 将图像保存到 SD 卡

    UPDATE Added