Запуск видеокамеры с намерением

Я пишу очень маленькое приложение, которое просто открывает приложение камеры, готовое для видео. Я могу заставить свой код работать на эмуляторе 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();

Похоже, что ТорстенW прав. Я бы поддержал ваш ответ, если бы мне хватило репутации. Вы можете видеть из logcat, что com.android.camera не может быть найден и выдает фатальное исключение. Логкат ниже.

D / dalvikvm (1159): GC_EXTERNAL_ALLOC освободил 251 объект / 13456 байт за 66 мс I / ActivityManager (1086): Начальное действие: Intent {act = android.intent.action. ГЛАВНАЯ .Phobos.QSVideo / .StartVid: pid = 483 uid = 10092 gids = {}

E / AndroidRuntime (483): java.lang.RuntimeException: не удалось запустить действие. класс активности {com.android.camera/com.android.camera.VideoCamera}; Вы объявили об этой активности в вашем AndroidManifest.xml?

E / AndroidRuntime (483): вызвано: android.content.ActivityNotFoundException: невозможно найти явный класс активности {com.android.camera/com.android.camera.Vid eoCamera}; Вы объявили об этой активности в вашем AndroidManifest.xml?

 Cristian20 сент. 2010 г., 05:52
Вы можете вставить logcat, сгенерированный вашей моторолой?

Ответы на вопрос(3)

поэтому активность у них другая. На моем Milestone (европейская версия 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);
 Phobos21 сент. 2010 г., 01:04
То есть нет способа запустить видеокамеру с намерения? Я просто хочу написать очень маленькое приложение для использования в качестве ярлыка для видеокамеры. По умолчанию процесс открывается в режиме неподвижной камеры. Спасибо за вашу помощь. Я бы поддержал ваш ответ, если бы мне хватило репутации. Постскриптум Я вставил исключения из журнала выше.

Торстенвв указывает; Старайтесь не начинать Intents с явных имен компонентов, если они не находятся внутри вашего приложения. Это может привести к поломке приложения в разных версиях Android.

Скорее используйтеметоды, которые появляются в документах.

Чтобы запустить камеру только для видео:

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

Прочитайте результат своей активности на ActivityResult:

@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);
    }
}
Решение Вопроса

насколько простым было решение. Сначала приложение камеры 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");

Это намерение использовать для вызова приложения камеры в режиме видео.

 Thorstenvv21 сент. 2010 г., 10:05
Отлично, сегодня я узнал что-то новое. Однако намерение в том виде, в котором вы его написали, не разрешается в Motorola Milestone 2.1-update1. Правильный способ - использовать константу SDK MediaStore.ACTION_VIDEO_CAPTURE, которая преобразуется в «android.media.action.VIDEO_CAPTURE».
 Phobos24 сент. 2010 г., 13:37
Спасибо за разъяснения. Я всегда стараюсь отвечать на свои вопросы, если могу. Пока что я люблю андроида. Я не писал никакого кода со времен Паскаля. Объектно-ориентированное программирование и намерения являются новыми для меня. Спасибо за респ.

Ваш ответ на вопрос