Как захватить изображение с камеры и загрузить в Retrofit multipart? - PullRequest
0 голосов
/ 09 июня 2019

Я делаю следующее, чтобы захватить изображение с камеры и загрузить его в веб-сервис с помощью многокомпонентной загрузки изображений, но у меня возникла проблема при преобразовании растрового изображения в файл изображения, чтобы можно было заполнить параметр 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 Ответ

0 голосов
/ 09 июня 2019

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

        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;
}

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

...