首页 文章

用意图启动摄像机

提问于
浏览
2

我正在写一个非常小的应用程序,只是打开相机应用程序准备视频 . 我可以让我的代码在Android 2.2模拟器上运行,但它不适用于我的设备,摩托罗拉Droid 1股票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在66ms I / ActivityManager(1086)中释放了251个对象/ 13456个字节:启动活动:Intent {act = android.intent.action . MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10200000 cmp = com.goatpen.Phobo s.QSVideo / .StartVid} I / ActivityManager(1086):启动proc com.goatpen.Phobos.QSVideo for activity com .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}: and roid.content.ActivityNotFoundException: Unable to find explicit activity class { com.android.camera/com.android.camera.VideoCamera}; have you declared this activ ity in your AndroidManifest.xml?

E/AndroidRuntime( 483): Caused by: android.content.ActivityNotFoundException: U nable to find explicit activity class {com.android.camera/com.android.camera.Vid eoCamera}; have you declared this activity in your AndroidManifest.xml?

3 回答

  • 3

    你不会相信解决方案有多简单 . 首先,motorola 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

    Thorstenvv points out;避免使用显式组件名称启动Intents,除非它们在您的应用程序中 . 这样做可能会破坏您在不同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);
        }
    }
    
  • 4

    摩托罗拉已将自己的相机应用程序放在Droid上,因此活动是不同的 . 在我的里程碑(欧洲版的Droid)上,该课程是com.motorola.Camera.Camcorder .

    此示例向您显示,如果在Android SDK中没有针对特定任务的常见意图操作,则不能依赖于使用具有固定包和类名字符串的意图机制 - 不幸的是,调用摄像机的情况就是如此 . 您需要为摄像机调用的活动在各种电话类型上可能会有所不同(如果用户修改,甚至可能在同一电话型号中) .

    但是,您可以通过发送带有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);
    

相关问题