2011-11-30 187 views
2

我正在开发一个用于数据收集的android应用程序。这个应用程序应该有可能通过使用通常的意图机制拍摄照片,视频,音频内容。MediaStore Intent不会返回任何东西

要启动图像捕捉目的不成问题。它显示,我可以拍摄一张照片,它保存在SD卡上。但在onActivityResult()中,如果选择“视频”或“照片”,则不会返回预期值。 resultCode是!= RESULT_OKdata.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==0x100resultCode==0x101,但是resultCode==0data==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"); 
     } 
    } 
} 

回答

1

从你EDIT3,你需要做这一行;

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

但实际上,需要在该文件对象保存到一个实例变量,然后在活动的结果,如果结果是好的,那么你只需要使用文件输出到访问图像/视频等。如果你愿意,你可以手动插入到mediaStore的活动结果(很容易找到谷歌搜索)

+0

但我不想给一个固定的文件名到新的照片。我想要什么:启动Camera-Intent,拍照,将其保存到SD卡上的默认位置(路径/文件名由camera-intent提供,fe _/sdcard/dcim/Camera/2012-01-10_14-12- 10_123.jpg_),回到我的应用程序'onActivityResult'获取'Intent data'中的uri。 –

+0

不幸的是,这并不是如何在android上的世界..好的android设计是这样的,任何从应用程序拍摄的照片需要保存在SD卡上的应用程序文件夹..只有从本机相机应用程序拍摄的照片应保存在默认文件夹..也就是说,模拟文件名和文件位置不应该很难 –