Android ACTION_IMAGE_CAPTURE Намерение - PullRequest
       93

Android ACTION_IMAGE_CAPTURE Намерение

160 голосов
/ 16 декабря 2009

Мы пытаемся использовать собственное приложение камеры, чтобы позволить пользователю сделать новый снимок. Это прекрасно работает, если мы пропустим EXTRA_OUTPUT extra и вернем маленькое растровое изображение. Однако, если мы putExtra(EXTRA_OUTPUT,...) намерены до его запуска, все работает, пока вы не нажмете кнопку «ОК» в приложении камеры. Кнопка «ОК» просто ничего не делает. Приложение камеры остается открытым и ничего не блокируется. Мы можем отменить его, но файл никогда не будет записан. Что именно мы должны сделать, чтобы ACTION_IMAGE_CAPTURE записал снимок, сделанный в файл?

Редактировать: Это делается с помощью MediaStore.ACTION_IMAGE_CAPTURE намерения, просто чтобы прояснить

Ответы [ 14 ]

0 голосов
/ 20 июня 2017
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_CANCELED)
    {
        //do not process data, I use return; to resume activity calling camera intent
        enter code here
    }
}
0 голосов
/ 21 октября 2015

Вы можете использовать этот код

private Intent getCameraIntent() {

    PackageManager packageManager = mContext.getPackageManager();
    List<ApplicationInfo> list = packageManager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
    Intent main = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    List<ResolveInfo> launchables = packageManager.queryIntentActivities(main, 0);
    if (launchables.size() == 1)
        return packageManager.getLaunchIntentForPackage(launchables.get(0).activityInfo.packageName);
    else
        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);
                String defaultCameraPackage = list.get(n).packageName;


                if (launchables.size() > 1)
                    for (int i = 0; i < launchables.size(); i++) {
                        if (defaultCameraPackage.equals(launchables.get(i).activityInfo.packageName)) {
                            return packageManager.getLaunchIntentForPackage(defaultCameraPackage);
                        }
                    }
            }
        }
    return null;
}
0 голосов
/ 16 июня 2014

Файл должен быть доступен для записи камерой, как указано Правин .

В моем случае я хотел сохранить файл во внутренней памяти. Я сделал это с:

Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (i.resolveActivity(getPackageManager()!=null)){
    try{
        cacheFile = createTempFile("img",".jpg",getCacheDir());
        cacheFile.setWritavle(true,false);
    }catch(IOException e){}
    if(cacheFile != null){
        i.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(cacheFile));
        startActivityForResult(i,REQUEST_IMAGE_CAPTURE);
    }
}

Здесь cacheFile - это глобальный файл, используемый для ссылки на записанный файл. Тогда в методе результата возвращенное намерение является нулем. Тогда метод обработки намерения выглядит так:

protected void onActivityResult(int requestCode,int resultCode,Intent data){
    if(requestCode != RESULT_OK){
        return;
    }
    if(requestCode == REQUEST_IMAGE_CAPTURE){
        try{
            File output = getImageFile();
            if(output != null && cacheFile != null){
                copyFile(cacheFile,output);

                //Process image file stored at output

                cacheFile.delete();
                cacheFile=null;
            }
        }catch(IOException e){}
    }
}

Здесь getImageFile() - это служебный метод для присвоения имени и создания файла, в котором должно храниться изображение, а copyFile() - это метод для копирования файла.

0 голосов
/ 24 ноября 2012

Я создал простую библиотеку, которая будет управлять выбором изображений из разных источников (Галерея, Камера), может быть, сохранить его в каком-то месте (SD-карта или внутренняя память) и вернуть изображение обратно, поэтому, пожалуйста, используйте его и улучшите - Android-ImageChooser .

...