我正在開發一個用於數據收集的android應用程序。這個應用程序應該有可能通過使用通常的意圖機制拍攝照片,視頻,音頻內容。MediaStore Intent不會返回任何東西
要啓動圖像捕捉目的不成問題。它顯示,我可以拍攝一張照片,它保存在SD卡上。但在onActivityResult()
中,如果選擇「視頻」或「照片」,則不會返回預期值。 resultCode
是!= RESULT_OK
和data.getData()
返回null
。獲得「音頻」似乎是沒有問題... ...
有很多教程和HOWTO文檔在網絡上,但我沒有發現差異,這可能會導致我的應用程序的行爲......
什麼是錯的?
爲了進行調試,我使用的是Android 2.2的Motorola Defy,它通過USB連接。 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位置,但應用程序崩潰時,它返回到我的活動。
這裏的堆棧(從德語語言環境翻譯爲英語):
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");
}
}
}
但我不想給一個固定的文件名到新的照片。我想要什麼:啓動Camera-Intent,拍照,將其保存到SD卡上的默認位置(路徑/文件名由camera-intent提供,fe _/sdcard/dcim/Camera/2012-01-10_14-12- 10_123.jpg_),回到我的應用程序'onActivityResult'獲取'Intent data'中的uri。 –
不幸的是,這並不是如何在android上的世界..好的android設計是這樣的,任何從應用程序拍攝的照片需要保存在SD卡上的應用程序文件夾..只有從本機相機應用程序拍攝的照片應保存在默認文件夾..也就是說,模擬文件名和文件位置不應該很難 –