【问题标题】:MediaStore Intent doesn't return anythingMediaStore Intent 不返回任何内容
【发布时间】:2011-12-23 01:24:37
【问题描述】:

我正在开发一个用于数据收集的安卓应用。这个应用程序应该有可能通过使用通常的意图机制来拍摄照片、视频、音频内容。

启动图像捕获意图是没有问题的。显示出来了,我可以拍张照片,保存在sdcard上。但是在onActivityResult() 中,如果选择了“视频”或“照片”,则不会返回预期值。 resultCode 是 != RESULT_OKdata.getData() 返回 null。获取“音频”似乎没问题...

网上有很多教程和howtos,但我没有发现差异,这可能导致我的应用程序的行为......

怎么了?

为了调试,我使用的是带有 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");
        }
    }
}

【问题讨论】:

    标签: android android-intent android-camera-intent


    【解决方案1】:

    从您的edit3,您需要执行此行;

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

    但是您实际上需要将该 File 对象保存到一个实例变量中,然后在活动结果上,如果结果正常,那么您只需使用 File 输出来访问图像/视频等。如果需要,您可以在活动结果上手动将其插入到 mediaStore(通过谷歌搜索很容易找到)

    【讨论】:

    • 但我不想给新照片一个固定的文件名。我想要什么:启动 Camera-Intent,拍照,将其保存到 sdcard 上的默认位置(路径/文件名由 camera-intent 给出,例如 /sdcard/dcim/Camera/2012-01-10_14- 12-10_123.jpg),回到我的应用程序onActivityResult 获取Intent data 中的uri。
    • 不幸的是,这不是它在 android 上的世界.. android 的良好设计是,从应用程序拍摄的任何图片都需要保存在 sdcard 上的应用程序文件夹中.. 只有从本机拍摄的图片相机应用程序应该保存在默认文件夹中.. 话虽如此,您应该不难模仿文件名和文件位置
    猜你喜欢
    • 2020-04-27
    • 2019-04-06
    • 2012-02-15
    • 2020-09-07
    • 2021-11-22
    • 2015-11-06
    • 2013-11-14
    • 2014-03-23
    • 2012-08-25
    相关资源
    最近更新 更多