Почему я не получаю изображения с моего Camera-Intent (в Android) - PullRequest
0 голосов
/ 12 сентября 2018

Я пишу небольшую программу, в которой я хотел бы получить изображение с моей камеры, отобразить его в виде изображения (и сохранить его позже). Поэтому я создал Intent в методе onclick для Button:

   File path;

    @Override
    public void onClick(View v) {
        path = new File(getFilesDir(), "Gallery/MyImages/");
        if (!path.exists()) path.mkdirs();

        File image = new File(path, "image_capture.jpg");
        Uri imageUri = FileProvider.getUriForFile(getApplicationContext(), CAPTURE_IMAGE_FILE_PROVIDER, image);

        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        providePermissionForProvider(cameraIntent, imageUri);

        mCurrentPhotoPath = image.getAbsolutePath();
        startActivityForResult(cameraIntent, ACTION_REQUEST_CAMERA);
    }

    private void providePermissionForProvider(Intent intent, Uri uri) {
       List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resInfoList) {
        String packageName = resolveInfo.activityInfo.packageName;
        grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
    }
}

Когда я нажимаю на кнопку, открывается Camera-App, я могу сделать снимок. После этого я хотел бы получить это изображение в растровом изображении в методе onActivityResult. Но это не работает:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        int targetW = main.getWidth();
        int targetH = main.getHeight();

        // Get the dimensions of the bitmap
        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        bmOptions.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
        int photoW = bmOptions.outWidth;
        int photoH = bmOptions.outHeight;

        // Determine how much to scale down the image
        int scaleFactor = Math.min(photoW/targetW, photoH/targetH);

        // Decode the image file into a Bitmap sized to fill the View
        bmOptions.inJustDecodeBounds = false;
        bmOptions.inSampleSize = scaleFactor;
        bmOptions.inPurgeable = true;

        Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
        Log.d("Facee", "afdadsfafdasfsfsfdsafdsafsdfdsafdsafdsafdsadsafdsadsf");
        main.setImageBitmap(bitmap);
}

Что я делаю не так? HELP

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

1 - Во-первых, вы должны проверить, есть ли в вашем манифесте разрешения:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />

и функция:

<uses-feature
    android:name="android.hardware.camera"
    android:required="true" />

Если у вас уже есть, вы можете последовать моему примеру этого, давайте просто.

2 - Представьте, что у вас есть ImageView и кнопка в вашей деятельности. Вы инициализируете свои компоненты и создадите функцию нажатия кнопки.

private boolean isCamera = false;
private Uri fileUri;
private ImageView mImageView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mImageView = layout.findViewById(R.id.mImageView);
    Button mTakePhotoButton = layout.findViewById(R.id.mImageView);
    mTakePhotoButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        final CharSequence[] items = {"Take photo", "Cancel"};

        isCamera = false;
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(getContext());
        alertDialog.setTitle("Select Picture");
        alertDialog.setItems(items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int item) {
                Intent intent;
                switch (item) {
                    case CAMERA:
                        isCamera = true;
                        intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        if (intent.resolveActivity(getContext().getPackageManager()) != null) {
                            try {
                                File photoFile = Utils.createImageFile();
                                fileUri = Uri.fromFile(photoFile);
                                intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
                                startActivityForResult(intent, 1);
                            } catch (IOException ex) {
                                Log.e("PROJECT_TEST", e.getMessage());
                            }
                        }
                        break;
                    /*case GALLERY:
                        intent = new Intent();
                        // Show only images, no videos or anything else
                        intent.setType("image/*");
                        intent.setAction(Intent.ACTION_GET_CONTENT);
                        // Always show the chooser (if there are multiple options available)
                        startActivityForResult(Intent.createChooser(intent, getString(R.string.select_picture)), imageBox);
                        break;*/
                    default:
                        dialog.dismiss();
                        break;
                }
            }
        });
        alertDialog.show();
        }
    });
}

My Utils.createImageFile , функция, которая создает файл в каталоге устройства:

public static File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "img_" + timeStamp + ".png";
    File storageDir = new File(Environment.getExternalStorageDirectory(), "MyFolder");
    if (!storageDir.exists())
        storageDir.mkdirs();
    return new File(storageDir, imageFileName);
}

3 - Вы вернете свое изображение в imageView как onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {
        try {

            Bitmap selectedImage;
            if (!isCamera && data != null && data.getData() != null) {
                fileUri = data.getData();
            }

            selectedImage = MediaStore.Images.Media.getBitmap(getContext().getContentResolver(), fileUri);

            if (selectedImage != null) {
                mImage1.setImageBitmap(selectedImage);
                String directory = fileUri.toString();
                Log.d("PROJECT_TEST", directory);
            }
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("PROJECT_TEST", e.getMessage());
        }
    }
}

Obs: Я использую Fragment, если вы используете активность, вы измените getContext () на это .

0 голосов
/ 12 сентября 2018

Вашему приложению требуется только разрешение на хранение. Убедитесь, что оно у вас есть -

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

При создании папки возникла проблема.
Используйте что-то вроде этого:

    path = new File(getExternalStorageDirectory()+ "/Gallery/MyImages/");
    if (!path.exists())path.mkdirs();

    File image = new File(path, "image_capture.jpg");
    Uri imageUri = FileProvider.getUriForFile(getApplicationContext(), CAPTURE_IMAGE_FILE_PROVIDER , image);

    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

    mCurrentPhotoPath = image.getAbsolutePath();
    startActivityForResult(cameraIntent, ACTION_REQUEST_CAMERA);

Обратите внимание: inPurgeable устарело в API 21

0 голосов
/ 12 сентября 2018

Я думаю, что вы не получаете точный путь вашего изображения.Используйте это:

File tempFile = File.createTempFile("camera", ".png", getExternalCacheDir());
mPath = tempFile.getAbsolutePath();
Uri uri = Uri.fromFile(tempFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);
...