【问题标题】:Starting Video Camera with Intent有意图地启动摄像机
【发布时间】:2010-09-20 03:50:17
【问题描述】:

我正在编写一个非常小的应用程序,它只打开准备好视频的相​​机应用程序。我可以让我的代码在 Android 2.2 模拟器上运行,但它无法在我的设备 Motorola Droid 1 stock 2.2 FRG22D 上运行。有什么想法我在这段代码上出错了吗?

public class StartVid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

final int VIDEO = 1;

    Intent intent = new Intent();
    intent.setClassName("com.android.camera","com.android.camera.VideoCamera");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivityForResult(intent, VIDEO );
    finish();

看来ThorstenW 是正确的。如果我有足够的代表,我会赞成你的回答。从logcat中可以看到com.android.camera 找不到并抛出了一个致命的异常。下面是 Logcat。

D/dalvikvm(1159):GC_EXTERNAL_ALLOC 在 66 毫秒内释放了 251 个对象/13456 个字节 I/ActivityManager(1086):开始活动:Intent { act=android.intent.action。 主猫=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.goatpen.Phobo s.QSVideo/.StartVid } I/ActivityManager(1086): 为活动 com 启动 proc com.goatpen.Phobos.QSVideo .goatpen.Phobos.QSVideo/.StartVid: pid=483 uid=10092 gids={}

E/AndroidRuntime(483): java.lang.RuntimeException: Unable to start activity Co mponentInfo{com.goatpen.Phobos.QSVideo/com.goatpen.Phobos.QSVideo.StartVid}:和 roid.content.ActivityNotFoundException:找不到明确的活动类{ com.android.camera/com.android.camera.VideoCamera};你宣布这个活动了吗 您的 AndroidManifest.xml 中的内容?

E/AndroidRuntime(483):原因:android.content.ActivityNotFoundException:U 无法找到明确的活动类 {com.android.camera/com.android.camera.Vid 相机};您是否在 AndroidManifest.xml 中声明了此活动?

【问题讨论】:

  • 能贴一下你的摩托罗拉生成的logcat吗?

标签: android video permissions camera android-intent


【解决方案1】:

您不会相信解决方案如此简单。首先,摩托罗拉 droid 的相机应用程序是 com.google.android.camera。这是标准的 android 2.2 包名称。我使用 adb 从 /data/system/packages.xml 中提取文件来确认这一点。

还有一个意图是在录像机模式下打开相机应用程序。 INTENT_ACTION_VIDEO_CAPTURE。

 Intent intent = new Intent("android.media.action.VIDEO_CAMERA");

这是用于在视频模式下调用相机应用的意图。

【讨论】:

  • 太好了,我今天学到了一些新东西。但是,您所写的意图并未在摩托罗拉里程碑 2.1-update1 上得到解决。正确的方法是使用 SDK 常量 MediaStore.ACTION_VIDEO_CAPTURE,解析为“android.media.action.VIDEO_CAPTURE”。
  • 感谢您的澄清。如果可以的话,我总是尽量回答我的问题。到目前为止,我喜欢安卓。自 Pascal 以来我没有写过任何代码。面向对象编程和意图对我来说是新的。感谢您的代表。
【解决方案2】:

作为Thorstenvv points out;避免使用显式组件名称启动 Intent,除非它们在您的应用程序中。这样做可能会在不同的 Android 版本中破坏您的应用。

相反,使用methods that appear in the docs.

仅针对视频启动相机:

static final int REQUEST_VIDEO_CAPTURE = 1;

private void dispatchTakeVideoIntent() {
    Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
    }
}

在您的 Activity onActivityResult 上阅读结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == REQUEST_VIDEO_CAPTURE && resultCode == RESULT_OK) {
        Uri videoUri = intent.getData();
        mVideoView.setVideoURI(videoUri);
    }
}

【讨论】:

    【解决方案3】:

    摩托罗拉在 Droid 上安装了自己的相机应用程序,因此活动是不同的。在我的 Milestone(欧洲版 Droid)上,类是 com.motorola.Camera.Camcorder。

    此示例向您展示,如果 Android SDK 中没有针对特定任务的通用意图操作(不幸的是,调用摄像机就是这种情况),则您不能依赖使用具有固定包和类名称字符串的意图机制。您需要为摄像机调用的 Activity 在不同的手机类型上可能并且将会有所不同(如果用户修改,甚至可能在相同的手机型号中)。

    但是,您可以通过使用 ACTION_CAMERA_BUTTON 发送有序广播来启动默认(静止)相机应用。

                        i = new Intent();
                        i.setFlags( Intent.FLAG_DEBUG_LOG_RESOLUTION);
                        i.setAction(Intent.ACTION_CAMERA_BUTTON);
                        i.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_CAMERA));
                        sendOrderedBroadcast(i, null);
    

    【讨论】:

    • 所以没有办法从一个意图启动摄像机?我只想编写一个非常小的应用程序用作摄像机的快捷方式。由于默认是在静态相机模式下打开进程。谢谢你的帮助。如果我有足够的代表,我会赞成你的回答。附言我从上面的 logcat 中粘贴了异常。
    猜你喜欢
    • 2019-02-08
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多