java - Android 2.2 SDK - Droid X 相机 Activity 未正确完成

标签 java android mobile android-2.2-froyo

我注意到我在 Droid X 上调用的默认相机 Activity 与我的 Droid 和 Nexus One 上的不同。在 Droid 和 Nexus One 上选择“确定”后, Activity 将结束 - Droid X 有一个“完成”按钮(它会将您带回相机,而不是完成 Activity ),这是到达我想要的屏幕是点击“后退”按钮。

这是适用于 Android 2.2/2.3 的类,但不适用于 Droid X:

package com.android.xxx;

import java.io.File;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.Window;

public class CameraView extends MenusHolder {

    protected String _path;
    protected boolean _taken;

    protected static final String PHOTO_TAKEN = "photo_taken";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.create_event_view);
        /*
         * save to sd
         */
        File imageDirectory = new File(
                Environment.getExternalStorageDirectory() + "/MyPath/");
        imageDirectory.mkdirs();
        /*
         * temp image overwrites each time for space
         */
        _path = Environment.getExternalStorageDirectory()
                + "/MyPath/temporary_image.jpg";
        startCameraActivity();
    }

    protected void startCameraActivity() {
        File file = new File(_path);
        Uri outputFileUri = Uri.fromFile(file);

        Intent intent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        startActivityForResult(intent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (resultCode) {
        case 0:
            setResult(5);
            finish();
            break;
        case -1:
            onPhotoTaken();
            break;
        }
    }

    protected void onPhotoTaken() {
        _taken = true;
        setResult(0);
        finish();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putBoolean(CameraView.PHOTO_TAKEN, _taken);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        if (savedInstanceState.getBoolean(CameraView.PHOTO_TAKEN)) {
            onPhotoTaken();
        }
    }

}

最佳答案

我用一个非常丑陋的解决方法解决了这个问题。我编写了两个函数来从 SD 卡读取和写入文件(取自此处:http://www.sgoliver.net/blog/?p=2035)。

private boolean readFile() {
    try
    {
        File sd_path = Environment.getExternalStorageDirectory();

        File f = new File(sd_path.getAbsolutePath(), "lock_camera_oncreate");

        BufferedReader fin =
            new BufferedReader(
                new InputStreamReader(
                    new FileInputStream(f)));

        String text = fin.readLine();
        fin.close();
        Log.e("Files", "Reading file");
        return true;
    }
    catch (Exception ex)
    {
        Log.e("Files", "Error reading file from SD Card");
        return false;
    }
}

private void createFile() {
    try
    {
        File sd_path = Environment.getExternalStorageDirectory();

        File f = new File(sd_path.getAbsolutePath(), "lock_camera_oncreate");

        OutputStreamWriter fout =
            new OutputStreamWriter(
                new FileOutputStream(f));

        fout.write("Semaphore test.");
        fout.close();
        Log.e("Files", "File writed");
    }
    catch (Exception ex)
    {
        Log.e("Files", "Error reading file from SD Card");
    }

}

然后,在 onCreate 函数中,我这样做:

public void onCreate(Bundle savedInstanceState) {
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    super.onCreate(savedInstanceState);

    if(readFile() == true)
    {
        File sd_path = Environment.getExternalStorageDirectory();
        File f = new File(sd_path.getAbsolutePath(), "lock_camera_oncreate");
        f.delete();

        Intent intent = this.getIntent();
        this.setResult(RESULT_OK, intent);
        return;
    }

    createFile();

    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCurrentImagePath)));
    startActivityForResult(cameraIntent, TAKE_PHOTO_CODE);
}

setRequestedOrientation 调用解决了当您在纵向模式下使用您的应用时的问题,但是当相机启动时,您将手机置于横向模式然后拍摄照片。

然后,丑陋的 readFile 东西检查 lock_camera_oncreate 文件是否存在,如果它是真的, 然后发生了一个额外的 onCreate 调用,因此删除文件并从该 Activity 中返回。

如果 Activity 继续进行,则意味着文件未创建并且只有一个相机 Activity 正在运行。

希望它能有所帮助,它很丑但对我有用 :D

关于java - Android 2.2 SDK - Droid X 相机 Activity 未正确完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4901752/

相关文章:

java - 为什么 JVM 中没有用于寻找 JIT 编译器的基础设施?

java - 在 Dropwizard 中设置必填配置字段

android - 使用来自 sharedPreferenceChange 的 pendingIntent 重新安排 inexactRepeating 警报

java - @ExceptionHandler 仅适用于 Exception.class

java - 为什么我一直收到 "Evaluations must contain either an expression or a block of well-formed statements"?

firefox - 移动浏览器将以及何时支持 getUserMedia?

javascript - Google Maps Javascript API 移动性能问题

javascript - 像桌面浏览器一样放大移动设备

java - 使用 Google API Java 客户端上传到 YouTube 时出现问题

android - 引导接收器和广播接收器之间的区别