Таинственное исключение NullpointerException после того, как встроенное приложение камеры правильно сохраняет мое видео - PullRequest
3 голосов
/ 21 октября 2011

У меня есть действие, которое позволяет вам записывать видео, если вы откроете диалог и нажмете значок.Проблема в том, что после того, как я прекращаю запись, он генерирует исключение NullPointerException, хотя видео сохраняется правильно.Согласно Log Cat, ошибка не в моем коде, поэтому я попытался разместить «контрольные точки» в своем коде, и я обнаружил, что даже onActivityResult моей деятельности выполняется правильно, поэтому теперь я не знаю, что делать.

Вот Log Cat:

enter image description here

Код:

Это из моего диалога, который вызывает приложение камеры

Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO); 


intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high
// start the Video Capture Intent

((Activity)context).startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);



private static Uri getOutputMediaFileUri(int type)
{ 
    return Uri.fromFile(getOutputMediaFile(type));
}


private static File getOutputMediaFile(int type)
{
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.
  File mediaStorageDir = new File(Environment.getExternalStorageDirectory()+"/Movies",   "MyCameraApp");
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("MyCameraApp", "failed to create directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + "/" +
        "IMG_"+ timeStamp + ".jpg");
    } else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + "/" +
        "VID_"+ timeStamp + ".mp4");
    } else {
        return null;
    }

    return mediaFile;
}

Этот код был более или менее скопирован с сайта разработчиков Android.Как я уже упоминал, даже после этого onActivityResult моей деятельности выполняется должным образом (где я закрываю диалог).

1 Ответ

0 голосов
/ 15 октября 2013

Попробуйте это:

private static File getOutputMediaFile(int type)
{
  File mediaStorageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);

    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("MyCameraApp", "failed to create directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = "IMG_"+ timeStamp + ".jpg";
    } else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = "VID_"+ timeStamp + ".mp4";
    } else {
        return null;
    }

    return new File(mediaStorageDir, mediaFile);
}

Метод getExternalStorageDirectory возвращает объект File, а не строку, к которой можно добавить подкаталог.

Также интересно, будет ли каталог, возвращенный этим методом, доступен для службы. В спецификации Android сказано:

На устройствах с несколькими пользователями (как описано UserManager) каждый Пользователь имеет свое собственное изолированное внешнее хранилище. Приложения имеют только доступ к внешнему хранилищу для пользователя, с которым он работает.

LOL !!!! Просто понял, этот вопрос был задан 2 года назад! Вы уже нашли ответ? LOL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...