Android 2.2 SDK - Droid X Camera Activity не завершается должным образом - PullRequest
1 голос
/ 04 февраля 2011

Я заметил, что активность камеры по умолчанию, которую я вызываю на Droid X, выглядит иначе, чем на Droid и Nexus One. После выбора «OK» на Droid и Nexus One, действие будет завершено - у Droid X есть кнопка «Готово» (которая возвращает вас к камере, вместо завершения действия), и единственный способ добраться до экран, который я хочу, это нажать кнопку «Назад».

Вот класс, который работает на Android 2.2 / 2.3, но не на Droid X's:

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();
        }
    }

}

Ответы [ 2 ]

1 голос
/ 30 декабря 2011

Я решил это с действительно очень уродливым решением. Я кодировал две функции для чтения и записи файлов с SDCard (взято отсюда: 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, поэтому удалите файл и ВОЗВРАТИТЕ из этого действия.

Если активность увеличивается, это означает, что файл не создан, и выполняется только одна операция с камерой.

Надеюсь, это поможет, уродливо, но у меня получилось: D

0 голосов
/ 04 февраля 2011

Чувак ... это просто ошибка.У меня была такая же проблема, и я не мог обойти это.Иногда это работает, а иногда нет.Я обратился к парню из Motorola за помощью, и они сказали, что поддержка этих образов Android отсутствует

...