Starting Video Camera with Intent

2020-02-10 10:49发布

I am writing a very small app that just opens the camera app ready for video. I am able to get my code to work on an Android 2.2 emulator, but it will not work on my device, Motorola Droid 1 stock 2.2 FRG22D. Any ideas where I went wrong on this code?

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();

It appears ThorstenW is correct. I would upvote your answer if I had enough rep. You can see from the logcat that com.android.camera could not be found and throws a fatal exception. Logcat below.

D/dalvikvm( 1159): GC_EXTERNAL_ALLOC freed 251 objects / 13456 bytes in 66ms I/ActivityManager( 1086): Starting activity: Intent { act=android.intent.action. MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.goatpen.Phobo s.QSVideo/.StartVid } I/ActivityManager( 1086): Start 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条回答
淡お忘
2楼-- · 2020-02-10 11:03

You will not believe how easy the solution was. First the motorola droid's camera app is com.google.android.camera. This is the standard android 2.2 package name. I used adb to pull the file from /data/system/packages.xml to confirm this.

Also there is an intent to open the camera app in video recorder mode. INTENT_ACTION_VIDEO_CAPTURE.

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

This is the intent to use to call the camera app in video mode.

查看更多
甜甜的少女心
3楼-- · 2020-02-10 11:08

Motorola has put their own camera app on the Droid, so the activity is a different one. On my Milestone (European version of Droid), the class is com.motorola.Camera.Camcorder.

This example shows you that you cannot rely on using the intent mechanism with fixed package and class name strings if there is no common intent action in Android SDK for a certain task - which is unfortunately the case for calling the video camera. The activity that you need to call for the video camera can and will be different on various phone types (potentially even among the same phone model if modified by the user).

You can however launch the default (still) camera app by sending an ordered broadcast with 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);
查看更多
爱情/是我丢掉的垃圾
4楼-- · 2020-02-10 11:16

As Thorstenvv points out; avoid starting Intents with explicit component names, unless they're inside your app. Doing so may break your app in different Android versions.

Rather, use the methods that appear in the docs.

To start the camera for videos only:

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);
    }
}

Read the result on your 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);
    }
}
查看更多
登录 后发表回答