2015-01-17 5 views
2

저는 비디오 기능 중 하나 인 미디어 기능이있는 앱을 디자인하고 있습니다. 나 자신의 카메라를 만드는 대신 카메라에 기본 호출을 사용하고 있습니다. 내가 가지고있는 문제는 비디오 파일을 캡처 한 후에는 내가 지정한 비디오 파일에 저장하지 않는다는 것입니다. 그러나 테스트 한이 문제는 재고 카메라 앱을 사용하는 삼성 휴대 전화에서만 발생합니다. 삼성 휴대 전화의 Google 카메라 또는 다른 회사의 휴대 전화를 사용하면 정상적으로 작동합니다. 이 버그는 삼성 휴대 전화의 알려진 버그입니까, 아니면 단지 잘못된 것입니까? 해결 방법이 있습니까?Android에서 동영상을 파일로 저장하기

여기 내 videoHandler입니다.

private void videoHandler() { 
    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 
    if (intent.resolveActivity(getPackageManager()) != null) { 
     File videoFile = null; 
     try { 
      videoFile = createVideoFile(); 
     } catch (IOException e) { 
      System.out.println("Error creating file."); 
     } 

     if (videoFile != null) { 
      videoUri = Uri.fromFile(videoFile); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, videoUri); 
      intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 
      intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 15000000L); 
      intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 6); 
      startActivityForResult(intent, VIDEO_REQUEST_CODE); 
     } 
    } 
} 

createVideoFile을 호출합니다. 여기서 createVideoFile은 대상에 대한 비디오 파일을 미리 만듭니다.

private File createVideoFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "MP4_" + timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 
    File video = File.createTempFile(
      imageFileName, /* prefix */ 
      ".mp4",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    this.videoUri = Uri.fromFile(video); 
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
    mediaScanIntent.setData(this.videoUri); 
    this.sendBroadcast(mediaScanIntent); 
    return video; 
} 

여기 내 onActivityResult에서 비디오를 호출하려고하면 오류가 발생합니다.

01-17 16:37:23.254 27162-28145/com.example.kevinem.blitz E/ImageLoader﹕ /storage/emulated/0/Pictures/MP4_20150117_163704_-918353230.mp4: open failed: ENOENT (No such file or directory) 
java.io.FileNotFoundException: /storage/emulated/0/Pictures/MP4_20150117_163704_-918353230.mp4: open failed: ENOENT (No such file or directory) 
     at libcore.io.IoBridge.open(IoBridge.java:409) 
     at java.io.FileInputStream.<init>(FileInputStream.java:78) 
     at java.io.FileInputStream.<init>(FileInputStream.java:105) 
     at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFromFile(BaseImageDownloader.java:160) 
     at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(BaseImageDownloader.java:88) 
     at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.getImageStream(BaseImageDecoder.java:93) 
     at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.decode(BaseImageDecoder.java:73) 
     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:264) 
     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:237) 
     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:135) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:841) 
Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory) 
     at libcore.io.Posix.open(Native Method) 
     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 
     at libcore.io.IoBridge.open(IoBridge.java:393) 
+0

오류가 있습니까? 게시 할 수있는 예외 스택 추적이 있습니까? –

답변

1

를 해결 것이라 생각합니다. 기본적으로 나는 이것을 말하는 누군가를 발견했다.

카메라 앱이 ACTION_IMAGE_CAPTURE 또는 ACTION_VIDEO_CAPTURE 규칙을 따를 필요는 없습니다. 일부는 특정 요청 된 출력 위치를 존중합니다. 어떤 사람들은 onActivityResult()에서 전달 된 결과 Intrient에 포함 된 Uri에 이미지/비디오를 저장하기로 선택한 곳으로 돌아 오지 않을 것입니다. 일부는 완전히 깨 졌을 수 있으며 저장된 이미지/비디오가있는 경우에도 아무 것도 알려주지 않습니다.

그런 다음 다른 게시물에서 수동으로 검색해야한다는 것을 알았습니다.

if (resultCode == -1) { 
     //create a MediaScanner to save the vid into the indicate path 
     new MediaScannerConnectionClient() { 
      private MediaScannerConnection msc = null; 
      { 
       msc = new MediaScannerConnection(
         getApplicationContext(), this); 
       msc.connect(); 
      } 

      public void onMediaScannerConnected() { 
       msc.scanFile(name_vid, null); 
      } 

      public void onScanCompleted(String path, Uri uri) { 
       msc.disconnect(); 

      } 
     }; 
     Toast.makeText(this,"Video saved succesfull", 
       Toast.LENGTH_SHORT).show(); 
} 

name_vid는 파일을 String 형식으로 저장하려는 경로입니다.

0

File.createTempFile()을 사용하는 특별한 이유가 있습니까?

주어진 접두사와 접미사를 사용하여 이름을 생성하는 빈 파일을 기본 임시 파일 디렉토리에 만듭니다. 이 메서드를 호출하면 은 createTempFile (prefix, suffix, null)을 호출하는 것과 같습니다.

Files.createTempFile 메서드는 임시 파일 디렉터리에 빈 파일을 만드는 대체 방법을 제공합니다. 에 의해 생성 된 파일은이 방법으로 생성 된 파일에 더 제한적인 액세스 권한을 가질 수 있으므로 보안에 민감한 응용 프로그램에 더 적합 할 수 있습니다.

의도 한 결과가 나오는지 확실하지 않습니다. 이 문서를 살펴 보는 것이 좋습니다.

http://developer.android.com/reference/android/os/Environment.html#getExternalStoragePublicDirectory(java.lang.String)

특히이 부분

.

File path = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 
File file = new File(path, "DemoPicture.jpg"); 
return file.exists(); 

TL; DR

나는이 요 시즈 내 문제를 해결

File video = new File(storageDir, imageFileName + ".mp4") 
+0

인스턴스화 후 video.mkdirs()를 고려하십시오. – brthornbury

+0

지금 해결책을 시험 할 수는 없지만 최대한 빨리 알려 드리겠습니다. – danigh

+0

나는 그냥 일반 파일을 만들려고했지만 여전히 작동하지 않습니다. – danigh

관련 문제