データ収集用の Android アプリを開発しています。このアプリは、通常のインテント メカニズムを使用して、写真、ビデオ、オーディオ コンテンツを撮影できる必要があります。
画像キャプチャ インテントを開始することは問題ありません。それが表示され、SD カードに保存されている写真を撮ることができます。ただし、onActivityResult()
「ビデオ」または「写真」が選択されている場合、期待される値は返されません。resultCode
は !=RESULT_OK
であり、 をdata.getData()
返しますnull
。「オーディオ」を取得することは問題ないようです...
ウェブ上には多くのチュートリアルやハウツーがありますが、アプリの動作に影響を与える可能性があるその違いは見つかりませんでした...
なにが問題ですか?
デバッグには、USB 経由で接続された Android 2.2 を搭載した Motorola Defy を使用しています。USBモードが「なし」に設定されているため、コンピューターは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:
アクティビティに追加super.onActivityResult(requestCode, resultCode, data);
しても違いはありませんでしたonActivityResult()
編集3:
ラインを変えてみた
toDo.putExtra(MediaStore.EXTRA_OUTPUT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
に
toDo.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("/sdcard/image.jpg")));
しかし、これもうまくいきません。画像は指定された 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
.
コード:
これは私のコードです:
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");
}
}
}