Nano Hash - криптовалюты, майнинг, программирование

Как захватить изображение с камеры и загрузить в Retrofit multipart?

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

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK)
    {
        final Bitmap photo = (Bitmap) data.getExtras().get("data");

        // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
        Uri tempUri = getImageUri(getActivity(), photo);

        // CALL THIS METHOD TO GET THE ACTUAL PATH
        File file = new File(getRealPathFromURI(tempUri));

        MyWebService webService =
                MyWebService.retrofit.create(MyWebService.class);

        MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));

        Call<com.syamantak.footsteps.models.response.Response> call = webService.set_profile_photo(filePart, "Bearer " + MainActivity.api_token);
        MainActivity.setProgressBarVisible();
        call.enqueue(new Callback<com.syamantak.footsteps.models.response.Response>() {
            @Override
            public void onResponse(Call<com.syamantak.footsteps.models.response.Response> call, Response<com.syamantak.footsteps.models.response.Response> response) {
                MainActivity.setProgressBarInVisible();
                com.syamantak.footsteps.models.response.Response jsonResponse = response.body();
                selfieImage.setImageBitmap(photo);
                Toast.makeText(getActivity(), jsonResponse.getMessage(), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(Call<com.syamantak.footsteps.models.response.Response> call, Throwable t) {
                t.getLocalizedMessage();
            }
        });
    }
}


public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

public String getRealPathFromURI(Uri uri) {
    String path = "";
    if (getActivity().getContentResolver() != null) {
        Cursor cursor = getActivity().getContentResolver().query(uri, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            path = cursor.getString(idx);
            cursor.close();
        }
    }
    return path;
}

Ниже приведен мой файл манифеста

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.syamantak.footsteps">

<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />
<uses-feature android:name="android.hardware.camera"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>

Я получаю следующую ошибку

E/MediaStore: Failed to insert image
java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=28108, uid=10237 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()

а также

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=67424, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.syamantak.footsteps/com.syamantak.footsteps.activities.MainActivity}: java.lang.NullPointerException: uriString

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


Ответы:


1

Я пришел к следующему решению

        final Bitmap photo = (Bitmap) data.getExtras().get("data");
        File file = savebitmap(photo);

        MyWebService webService =
                MyWebService.retrofit.create(MyWebService.class);

        MultipartBody.Part filePart = MultipartBody.Part.createFormData("photo", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));

        Call<com.syamantak.footsteps.models.response.Response> call = webService.set_profile_photo(filePart, "Bearer " + MainActivity.api_token);
        MainActivity.setProgressBarVisible();
        call.enqueue(new Callback<com.syamantak.footsteps.models.response.Response>() {
            @Override
            public void onResponse(Call<com.syamantak.footsteps.models.response.Response> call, Response<com.syamantak.footsteps.models.response.Response> response) {
                MainActivity.setProgressBarInVisible();
                com.syamantak.footsteps.models.response.Response jsonResponse = response.body();
                selfieImage.setImageBitmap(photo);
                Toast.makeText(getActivity(), jsonResponse.getMessage(), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(Call<com.syamantak.footsteps.models.response.Response> call, Throwable t) {
                t.getLocalizedMessage();
            }
        });

и следующая функция для преобразования растрового изображения в файл

private File savebitmap(Bitmap bmp) {
    String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
    OutputStream outStream = null;
    // String temp = null;
    File file = new File(extStorageDirectory, "temp.png");
    if (file.exists()) {
        file.delete();
        file = new File(extStorageDirectory, "temp.png");

    }

    try {
        outStream = new FileOutputStream(file);
        bmp.compress(Bitmap.CompressFormat.PNG, 100, outStream);
        outStream.flush();
        outStream.close();

    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
    return file;
}

Это работает хорошо.

09.06.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..