2011-11-30 3 views
2

데이터 수집을위한 Android 앱을 개발 중입니다. 이 응용 프로그램은 일반적인 의도 메커니즘을 사용하여 사진, 비디오, 오디오 콘텐츠를 가져올 수 있어야합니다.MediaStore 인 텐트가 아무 것도 반환하지 않습니다.

이미지 캡처를 시작하려면 아무런 문제가 없습니다. 그것은 보여지고, 나는 sdcard에 저장된 사진을 찍을 수 있습니다. 그러나 onActivityResult()에서 "비디오"또는 "사진"이 선택되면 예상 값이 반환되지 않습니다. resultCode은! = RESULT_OK이고 data.getData()null을 반환합니다. ... 웹에 많은 자습서 및 하우투는

... "오디오"아무 문제 없을 것 같다가 있습니다 받기,하지만 난 내 응용 프로그램의 동작이 발생할 수 차이를 찾을 수 없습니다

무엇이 잘못 되었나요?

디버깅을 위해 USB를 통해 연결된 Android 2.2와 Motorola Defy를 사용하고 있습니다. USB 모드는 "none"으로 설정되어 있지 않으므로 컴퓨터가 sd 카드를 잠그지 않습니다.

편집 1 : 첫 번째 시도로

, 나는 AndroidManifest.xml에이 라인을 추가했지만 아무런 차이가 없습니다 :

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.RECORD_AUDIO"/> 

편집 2 :

onActivityResult()super.onActivityResult(requestCode, resultCode, data); 추가는 활동에 차이가 없다.

,451,515,

편집 3 :

toDo.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("/sdcard/image.jpg"))); 

에 선

toDo.putExtra(MediaStore.EXTRA_OUTPUT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

을 변경하려고했지만이 중 하나가 작동하지 않습니다. 이미지는 주어진 위도 (uri-position)에 저장되지만 앱이 내 활동으로 돌아 가면 충돌합니다.

Thread [<1> main] (Paused (Exception RuntimeException)) 
    ActivityThread.deliverResults(ActivityThread$ActivityRecord, List) Line: 3605 
    ActivityThread.handleSendResult(ActivityThread$ResultData) Line: 3647 
    ActivityThread.access$3000(ActivityThread, ActivityThread$ResultData) Line: 129 
    ActivityThread$ResultData(ActivityThread$H).handleMessage(Message) Line: 2147 
    ActivityThread$H(Handler).dispatchMessage(Message) Line: 99 
    Looper.loop() Line: 143 
    ActivityThread.main(String[]) Line: 4717  
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) Line: not available [native method] 
    Method.invoke(Object, Object...) Line: 521 
    ZygoteInit$MethodAndArgsCaller.run() Line: 860 
    ZygoteInit.main(String[]) Line: 618 
    NativeStart.main(String[]) Line: not available [native method] 

편집 : 4 :

되돌 렸습니다 편집 3.

onActivityResult의 리턴 값에 대한보고가 있었다 여기

은 (영어 독일어 로케일에서 번역) 스택의 다시. 비디오 또는 이미지/사진의 경우이 둘은 맞습니다 : requestCode==0x100 또는 resultCode==0x101, 그러나 resultCode==0data==null.

코드 : 이것은 내 코드입니다

: 당신의 EDIT3에서

package test.mediastore; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class StartActivity extends Activity { 

    private Button ImageCaptureButton = null; 
    private Button VideoCaptureButton = null; 
    private Button AudioCaptureButton = null; 
    private TextView InfoTextView = null; 

    final static int IMAGE_CAPTURE = 0x100; 
    final static int VIDEO_CAPTURE = 0x101; 
    final static int AUDIO_CAPTURE = 0x102; 


     /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ImageCaptureButton = (Button)findViewById(R.id.ImageCaptureButton); 
     ImageCaptureButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Intent toDo = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       toDo.putExtra(MediaStore.EXTRA_OUTPUT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(toDo, IMAGE_CAPTURE); 
      } 
     }); 
     VideoCaptureButton = (Button)findViewById(R.id.VideoCaptureButton); 
     VideoCaptureButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Intent toDo = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 
       toDo.putExtra(MediaStore.EXTRA_OUTPUT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(toDo, VIDEO_CAPTURE); 
      } 
     }); 
     AudioCaptureButton = (Button)findViewById(R.id.AudioCaptureButton); 
     AudioCaptureButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       Intent toDo = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); 
       toDo.putExtra(MediaStore.EXTRA_OUTPUT, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(toDo, AUDIO_CAPTURE); 
      } 
     }); 

     InfoTextView = (TextView)findViewById(R.id.InfoTextView);  
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); // Edit 2 - made no difference 
     if (resultCode == RESULT_OK) { 
      switch (requestCode) { 
      case IMAGE_CAPTURE: 
       InfoTextView.setText("Image"); 
       break; 
      case VIDEO_CAPTURE: 
       InfoTextView.setText("Video"); 
       break; 
      case AUDIO_CAPTURE: 
       InfoTextView.setText("Audio"); 
       break; 
      default: 
       InfoTextView.setText("None"); 
      } 
     } else { 
      InfoTextView.setText("resultCode != RESULT_OK"); 
     } 
    } 
} 

답변

1

, 당신은이 선을 할 필요가;

toDo.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("/sdcard/image.jpg"))); 

는하지만 실제로 결과가 OK 인 경우 다음 방금 등등 이미지/비디오에 액세스하려면 파일 출력을 사용하여, 다음 활동 결과에하는 인스턴스 변수로 해당 파일 오브젝트를 저장해야합니다. 원하는 경우 활동 검색 결과에 수동으로 mediaStore에 삽입 할 수 있습니다. (검색을 통해 쉽게 찾을 수 있음)

+0

하지만 새 사진에 고정 된 파일 이름을 부여하고 싶지 않습니다. 원하는 사항 : Camera Intent를 시작하고 사진을 찍은 다음 sdcard의 기본 위치에 저장합니다 (경로/파일 이름은 카메라 의도에 의해 지정됨, fe _/sdcard/dcim/Camera/2012-01-10_14-12- 10_123.jpg_), 내 응용 프로그램에'onActivityResult'는'Intent data'에서 uri를 얻습니다. –

+0

안드로이드에 대한 불행히도 안드로이드에 대한 좋은 디자인이 아닙니다. 안드로이드에 대한 좋은 디자인은 앱에서 찍은 사진을 sdcard의 apps 폴더에 저장해야한다는 것입니다. 네이티브 카메라 앱에서 가져온 사진 만이 즉, 파일 이름과 파일 위치를 모방해서는 안됩니다. –

관련 문제