Могу ли я заставить свое приложение запускать камеру по умолчанию, а не предлагать список «Выполнить действие»? - PullRequest
5 голосов
/ 26 сентября 2011

Я использую намерение новое намерение (MediaStore.ACTION_IMAGE_CAPTURE); для захвата изображения для использования в моем приложении.На моем устройстве установлено два приложения, которые могут выполнять эту функцию, но хотелось бы, чтобы мое приложение использовало только камеру по умолчанию.

Есть ли способ сделать это?

Ответы [ 5 ]

3 голосов
/ 30 января 2012

Как предложил Dr_sulli, я просто конвертирую его в код, и он хорошо работает для меня. Если дело касается доступа к приложению с прямой камерой и другой части, это позволяет пользователю выбирать другие приложения камеры вместе с системной камерой.

protected static final int CAMERA_ACTIVITY = 100;

Intent mIntent = null;
        if(isPackageExists("com.google.android.camera")){
            mIntent= new Intent();
            mIntent.setPackage("com.google.android.camera");
            mIntent.setAction(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            mIntent.putExtra("output", Uri.fromFile(new File(Environment
                    .getExternalStorageDirectory(), "/myImage" + ".jpg")));
        }else{
        mIntent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        mIntent.putExtra("output", Uri.fromFile(new File(Environment
                .getExternalStorageDirectory(), "/myImage" + ".jpg")));

        Log.i("in onMenuItemSelected",
                "Result code = "
                        + Environment.getExternalStorageDirectory());
        }
        startActivityForResult(mIntent, CAMERA_ACTIVITY);

внутри onActivityResult делать ваши вещи

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    Log.i("in onActivityResult", "Result code = " + resultCode);
    if (resultCode == -1) {
        switch (requestCode) {
        case CAMERA_ACTIVITY:
            //do your stuff here, i am just calling the path of stored image
            String filePath = Environment.getExternalStorageDirectory()
                    + "/myImage" + ".jpg";
                    }
                     }
                 }

isPackageExists подтвердит, существует ли пакет или нет.

public boolean isPackageExists(String targetPackage){
    List<ApplicationInfo> packages;
    PackageManager pm;
        pm = getPackageManager();        
        packages = pm.getInstalledApplications(0);
        for (ApplicationInfo packageInfo : packages) {
    if(packageInfo.packageName.equals(targetPackage)) return true;
    }        
    return false;
}

ИЛИ вы можете сделать это по-своему намного проще, это отфильтрует все системные приложения, а затем вы сравните имя, следовательно, оно будет работать на всех телефонах, но вышеописанная техника из-за жесткого кодирования не сработает на всех телефонах. Позже вы можете использовать это имя пакета, чтобы начать работу камеры, как описано выше.

PackageManager pm = this.getPackageManager();

    List<ApplicationInfo> list = getPackageManager().getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
    for (int n=0;n<list.size();n++) {
        if((list.get(n).flags & ApplicationInfo.FLAG_SYSTEM)==1)
        {
            Log.d("Installed Applications", list.get(n).loadLabel(pm).toString());
            Log.d("package name", list.get(n).packageName);
            if(list.get(n).loadLabel(pm).toString().equalsIgnoreCase("Camera"))
                break;
        }
    }
2 голосов
/ 27 сентября 2013
    List<ApplicationInfo> list = packageManager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
    for (int n=0;n<list.size();n++) {
        if((list.get(n).flags & ApplicationInfo.FLAG_SYSTEM)==1)
        {
            Log.d("TAG", "Installed Applications  : " + list.get(n).loadLabel(packageManager).toString());
            Log.d("TAG", "package name  : " + list.get(n).packageName);
            if(list.get(n).loadLabel(packageManager).toString().equalsIgnoreCase("Camera")) {
                defaultCameraPackage = list.get(n).packageName;
                break;
            }
        }
    }

Я нахожу следующее решение и оно отлично работает.

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.setPackage(defaultCameraPackage); 
startActivityForResult(takePictureIntent, actionCode);

Вы можете отфильтровать камеру по умолчанию, установив пакет в вышеуказанном намерении. Я протестировал его, установив два приложения Линейная камера и Бумажная камера в обоих приложениях показывалось средство выбора, но фильтрация по пакету над кодом открыта только камера по умолчанию.

1 голос
/ 08 августа 2018

Я подготовил решение, которое работает практически во всех решениях:

  private void openCamera() {
        String systemCamera;
        if (isPackageExists("com.google.android.camera")) {
            systemCamera = "com.google.android.camera";
        } else {
            systemCamera = findSystemCamera();
        }

        if (systemCamera != null) {
            Log.d(TAG, "System Camera: " + systemCamera);
            Intent mIntent = new Intent();
            mIntent.setPackage(systemCamera);
            File f = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), ("IMG_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".jpg"));
            mIntent.setAction(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            mIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
            startActivityForResult(mIntent, IMAGE_CODE_PICKER);
        } else {
            //Unable to find default camera app 
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == IMAGE_CODE_PICKER && resultCode == RESULT_OK) {

        }
    }

    private boolean isPackageExists(String targetPackage) {
        List<ApplicationInfo> packages;
        PackageManager pm;
        pm = getPackageManager();
        packages = pm.getInstalledApplications(0);
        for (ApplicationInfo packageInfo : packages) {
            if (packageInfo.packageName.equals(targetPackage)) {
                return true;
            }
        }
        return false;
    }

    private String findSystemCamera() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        PackageManager packageManager = this.getPackageManager();
        List<ResolveInfo> listCam = packageManager.queryIntentActivities(intent, 0);
        for (ResolveInfo info :
                listCam) {
            if (isSystemApp(info.activityInfo.packageName)) {
                return info.activityInfo.packageName;
            }
        }
        return null;
    }


    boolean isSystemApp(String packageName) {
        ApplicationInfo ai;
        try {
            ai = this.getPackageManager().getApplicationInfo(packageName, 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            return false;
        }
        int mask = ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
        return (ai.flags & mask) != 0;
    }

Возможно, вам потребуется добавить следующий код в метод onCreate:

StrictMode.VmPolicy.Builder newbuilder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(newbuilder.build());
0 голосов
/ 20 февраля 2017

приложение камеры по умолчанию - это первое приложение, которое было установлено.Итак, первым элементом в списке камер является приложение по умолчанию

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    PackageManager packageManager = MapsActivity.this.getPackageManager();
    List<ResolveInfo> listCam = packageManager.queryIntentActivities(intent, 0);
    intent.setPackage(listCam.get(0).activityInfo.packageName);
    startActivityForResult(intent,INTENT_REQUESTCODE1);
0 голосов
/ 26 сентября 2011

Я не уверен, что то, что вы пытаетесь сделать, переносимо на все устройства. Одна из целей Android - обеспечить простую замену действий, которые запрашивает служба, например захват изображения. При этом, если вы хотите сделать это только для своего устройства, вы можете просто установить имя компонента в намерении на имя действия захвата мультимедиа.

...