데이터 수집을위한 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);
추가는 활동에 차이가 없다.
편집 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==0
및
data==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");
}
}
}
하지만 새 사진에 고정 된 파일 이름을 부여하고 싶지 않습니다. 원하는 사항 : Camera Intent를 시작하고 사진을 찍은 다음 sdcard의 기본 위치에 저장합니다 (경로/파일 이름은 카메라 의도에 의해 지정됨, fe _/sdcard/dcim/Camera/2012-01-10_14-12- 10_123.jpg_), 내 응용 프로그램에'onActivityResult'는'Intent data'에서 uri를 얻습니다. –
안드로이드에 대한 불행히도 안드로이드에 대한 좋은 디자인이 아닙니다. 안드로이드에 대한 좋은 디자인은 앱에서 찍은 사진을 sdcard의 apps 폴더에 저장해야한다는 것입니다. 네이티브 카메라 앱에서 가져온 사진 만이 즉, 파일 이름과 파일 위치를 모방해서는 안됩니다. –