2015-03-31 2 views
4

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

У меня есть метод в моем основном действии buttonOnClickRecord, который вызывает намерение использовать камеру Android, я также создаю файл во время этого вызова метода, и я вызываю метод mkdirs() на нем, чтобы создать каталог для хранения файл.

Я также внедрил <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> в свой манифест.

public void buttonOnClickRecord(View v){ 
     mediaFile = 
       new File(Environment.getExternalStorageDirectory().getAbsolutePath() 
         + "/NewDirectory/myvideo.mp4"); 
     mediaFile.mkdirs(); 

     Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 
     if (takeVideoIntent.resolveActivity(getPackageManager()) != null) { 

      Uri videoUri = Uri.fromFile(mediaFile); 
      takeVideoIntent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri); 
      startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE); 
     } 
    } 

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) { 

      Toast.makeText(this, "Video saved to:\n" + 
        data.getData(), Toast.LENGTH_LONG).show(); 
     } else if (resultCode == RESULT_CANCELED) { 


    Toast.makeText(this, "Video recording cancelled.", 
       Toast.LENGTH_LONG).show(); 
    } else { 
     Toast.makeText(this, "Failed to record video", 
       Toast.LENGTH_LONG).show(); 
    } 
} 

если я удалить /NewDirectory/ видео файл сохраняется в корне сд карты, и я получаю сообщение, что влияет на моего onActivityResult метода.

Но с /NewDirectory/ добавил я получаю видео сохранено в: content:://media/external/video/media/15625

mediaFile.mkdirs(); не создает каталог.

Где я пошла не так?

+1

Помимо этого 'пытаются создать каталог с именем myvideo.mp4', как указано выше, прежде чем вы не проверите возвращаемое значение mkdirs(). И вы должны firast проверить, существует ли каталог, и только вызывать mkdirs, если нет. Вы также должны использовать File.canWrite() в этом каталоге. Не продолжайте свой код, когда каталог tjhe не может быть создан или недоступен для записи. – greenapps

ответ

5

Вы пытаетесь создать каталог под названием myvideo.mp4.

mediaFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() 
         + "/NewDirectory/myvideo.mp4"); 
mediaFile.mkdirs(); 

должен быть

File(Environment.getExternalStorageDirectory(), "NewDirectory"); 
mediaFile.mkdirs(); 

или лучше

mediaFile = new File(getExternalCacheDir(), "NewDirectory"); 
mediaFile.mkdirs(); 

Here вы можете найти документацию для getExternalCacheDir()

Учтите что от KitKat письма на корень из SDCard является больше не допускается.

Edit: путь к файлу должен быть:

mediaFile = new File(getExternalCacheDir(), "NewDirectory"); 
File file = new File(mediaFile, "myvideo.mp4"); 
Uri videoUri = Uri.fromFile(file); 
+0

Где я должен писать свои файлы? – Johntk

+0

Что вы подразумеваете под последним комментарием? – weston

+2

@weston, официальные приложения больше не имеют права писать в корне 'sdcard'. У них все еще есть возможность писать в '/ sdcard/Android/data/app.packagename'. Некоторые поставщики не применяют это ограничение – Blackbelt

2

Для создания использования каталога:

String rootDirectory = Environment.getExternalStorageDirectory().toString(); 
File myDir = new File(rootDirectory + "/NewDirectory"); 
myDir.mkdir(); 

Вы можете сохранить файл с:

recorder.setOutputFile(Environment.getExternalStorageDirectory().toString() + "/NewDirectory/" +fileName); 

Для находки видео для обмена или размножения:

File sdcard = Environment.getExternalStorageDirectory(); 
File directory = new File(sdcard.getAbsolutePath() + "/NewDirectory"); 
File video = new File(directory, fileName); 
+1

Это сработало для меня. соображения относительно ограничений операций записи в определенных папках зависят от версии Android (начиная с kitKat 4.4 и далее они значительны). –

Смежные вопросы