Не получается файл с камеры - PullRequest
0 голосов
/ 05 ноября 2018

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

-Открытая камера

- сделать фото и сохранить изображение

Затем, когда я отправляю путь к другому действию, он говорит, что на этом пути ничего нет.

Я использую provider, потому что иначе это не сработает ...

Это мой провайдер в manifest.xml

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"
                tools:replace="android:resource"/>
        </provider>

Тогда я фотографирую, используя это:

private void doTakePhotoAction() {

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        mImageCaptureUri = FileProvider.getUriForFile(TakePictureAndCropActivity.this, BuildConfig.APPLICATION_ID+".provider", new File(Environment.getExternalStorageDirectory(),
                "tmp_contact_" + String.valueOf(System.currentTimeMillis()) + ".jpg"));

        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);

        try {
            intent.putExtra("return-data", false);
            startActivityForResult(intent, PICK_FROM_CAMERA);
        } catch (ActivityNotFoundException e) {
            e.printStackTrace();
        }
    }

А потом я отправляю это на мою другую деятельность

Intent intent = new Intent(this, CropImage.class);
                intent.putExtra("image-path", mImageCaptureUri.getPath());
                intent.putExtra("scale", true);
                startActivity(intent);

возвращает "" эти методы

mImagePath = extras.getString("image-path");

            mSaveUri = getImageUri(mImagePath);
            if( extras.getString( MediaStore.EXTRA_OUTPUT ) != null ) mSaveUri = getImageUri( extras.getString( MediaStore.EXTRA_OUTPUT ) );

            mBitmap = getBitmap(mImagePath);

getImageUri - это просто: return Uri.fromFile(new File(path)); и это возвращает меня "file: ///external/tmp_contact_1541377710472.jpg"

А потом я получаю это:

java.io.FileNotFoundException: /external/tmp_contact_1541377710472.jpg (нет такого файла или каталога)

Кстати, provider_paths содержит это:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external"
        path="." />
    <external-files-path
        name="external_files"
        path="." />
    <cache-path
        name="cache"
        path="." />
    <external-cache-path
        name="external_cache"
        path="." />
    <files-path
        name="files"
        path="." />
</paths>

1 Ответ

0 голосов
/ 05 ноября 2018

То, что вы можете попытаться сделать, это взять изображение как растровое изображение, преобразовать его в ByteArray, передать его с намерением следующему действию, а затем преобразовать его обратно в растровое изображение во втором действии. (Растровое изображение - это тип формата файла изображения).

Получение растрового изображения:

 //This should be in your doTakePhotoAction() method.
 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 startActivityForResult(cameraIntent, 100);

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == 100) {
           Bitmap bitmap = ImagePicker.getImageFromResult(this, resultCode, data); 
        }
    }
    super.onActivityResult(requestCode, resultCode, data);

}

Как только вы получите растровое изображение из вашего startActivityForResult, вы можете сделать следующее:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
//convert to ByteArray
byte[] byteArray = stream.toByteArray();
//Add to intent
Intent intent = new Intent(this, MainActivity2.class);
intent.putExtra("image",byteArray);
startActivity(intent);

Второе занятие:

byte[] byteArray = getIntent().getByteArrayExtra("image");
//Convert back to Bitmap.
Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

Теперь, когда у вас есть растровое изображение, вы можете делать с ним все, что захотите.

...