Android: сделать снимок с помощью камеры и сохранить его в файле java.io.File - PullRequest
1 голос
/ 01 февраля 2012

Я пытаюсь получить изображение от пользователя, а затем отправить его на наш сервер.Я предоставляю два варианта: выбрать из галереи или сделать новый снимок, используя камеру по умолчанию в своих телефонах.

Галерея работает правильно, я могу получить выбранное фото и без проблем отправить его.Но в режиме камеры камера открывается, делает снимок, сохраняет его на SD-карте с указанным местоположением, без проблем, но когда он возвращается обратно в мое приложение, я всегда получаю исключение NullPointerException, и мое приложение принудительно закрывается.Вот что я делаю:

private String tempFilePath = "";    
...
public void addPhotoUsingCamera() {

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    tempFilePath = getOutputMediaFilePath(MEDIA_TYPE_IMAGE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(tempFilePath)));     
    startActivityForResult(intent, CAMERA_ACTIVITY_CODE);
}

И затем я использую следующее, чтобы сделать фотографию:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    ...
    case CAMERA_ACTIVITY_CODE:
        if (resultCode == Activity.RESULT_OK) {         
            picture = new File(tempFilePath);
        }
        break;
    ...
    }
}

Я также попробовал

Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
ImageView image = (ImageView) findViewById(R.id.photoTaken);
image.setImageBitmap(thumbnail);

внутри case CAMERA_ACTIVITY_CODE: но независимо от того, что я пытаюсь, я всегда получаю исключение NullPointerException в этой части кода.

Есть информация logcat, где строка 202 соответствует case CAMERA_ACTIVITY_CODE: части.

01-31 23:40:13.154: ERROR/AndroidRuntime(8009): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=101, result=-1, data=null} to activity {com.ollaa.android/com.ollaa.android.share.ShareFinalScreen}: java.lang.NullPointerException

01-31 23:40:13.154: ERROR/AndroidRuntime(8009): Caused by: java.lang.NullPointerException
01-31 23:40:13.154: ERROR/AndroidRuntime(8009):     at com.ollaa.android.share.ShareFinalScreen.onActivityResult(ShareFinalScreen.java:202)

Любая помощьс благодарностью.

Примечание: Я объявил все необходимые разрешения в AndroidManifest, относящиеся к камере и SD-карте.

РЕДАКТИРОВАТЬ: Я понял, чтоtempFilePath не продолжается до тех пор, пока активность камеры не вернется в мое приложение.Я поместил инициализацию для tempFilePath в свой метод onCreate, но это время не устанавливается, когда я пытаюсь получить его из внешней функции, отличной от onActivityResult.Мне кажется, что я вообще не знаю Java, когда мы меняем переменную класса внутри функции, измененное значение должно быть видно из всех функций этого класса, верно ??

1 Ответ

2 голосов
/ 01 февраля 2012

При использовании:

intent.putExtra (MediaStore.EXTRA_OUTPUT, myFile);

Файл должен существовать на «диске».Camera Activity не создает его, что, по-моему, ошибка.Поэтому вы должны использовать myFile.createNewFile();
Кроме того, вы должны отправить Camera Activity файл, а не путь.

Попробуйте что-то вроде этого:

 tempFilePath = getOutputMediaFilePath(MEDIA_TYPE_IMAGE);
 String fileName = "myPhoto";   
 File myFile = new File (tempFilePath,fileName); 
 myFile.createNewFile();   
 // at this point stop the debugger and check if the file exists on the 'disk'.  
 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(myFile)));

Возможно, есть лучший способ сделать это без использования MediaStore.EXTRA_OUTPUT.Может быть, другой пользователь может помочь.

Кроме того, обратите внимание, если пользователь нажимает кнопку отмены и не делает снимок, необходимо удалить файл.

Примечание. Я использую Android API 2.2.

Надеюсь, это поможет.

...