Как прикрепить изображения с разных путей к электронному письму? - PullRequest
0 голосов
/ 04 мая 2018

Я использую intent для отправки email с темой, содержанием и прикрепленными изображениями

все работает отлично, за исключением некоторых изображений, которые не прикрепляются

Путь к файлу для успешно прикрепленных фотографий выглядит так:

content://media/external/images/media/14960

Путь к файлу для неудачно прикрепленных фотографий такой:

content://com.android.providers.media.documents/document/image%3A14745

Я использую этот код

Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("message/rfc822");
//emailIntent.setType("application/image");
emailIntent.putExtra(Intent.EXTRA_EMAIL  , new String[]{""});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, mNotes.get(position).getTitle());
emailIntent.putExtra(Intent.EXTRA_TEXT   , mNotes.get(position).getContent());

ArrayList<String[]> photos = StringManipulation.imgDeserialize(mNotes.get(position).getImgUrls());
for (String[] photo : photos){
    emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(photo[0]));
}

startActivity(Intent.createChooser(emailIntent, "Send mail..."));

Как сделать так, чтобы все фотографии прикреплялись к электронному письму?

Я получил этот Uris, получив разрешения для CAMERA, READ и WRITE EXTERNAL STORAGE

//.... onCreate...
    //initialize the textview for starting the camera
    TextView takePhoto = (TextView) view.findViewById(R.id.tvTakeCameraPhoto);
    takePhoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG, "onClick: starting camera.");
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, Permissions.CAMERA_REQUEST_CODE);
        }
    });

    //Initialize the textview for choosing an image from memory
    TextView selectPhoto = (TextView) view.findViewById(R.id.tvChoosePhotoFromMemory);
    selectPhoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG, "onClick: accessing phones memory.");
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
            startActivityForResult(intent, Permissions.PICK_FILE_REQUEST_CODE);
        }
    });
//.................
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    /*
    Results when taking a new image with camera
     */
    if(requestCode == Permissions.CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_OK){
        Log.d(TAG, "onActivityResult: done taking a picture.");

        //get the new image bitmap
        Bitmap bitmap = (Bitmap) data.getExtras().get("data");
        Log.d(TAG, "onActivityResult: received bitmap: " + bitmap);

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

        // CALL THIS METHOD TO GET THE ACTUAL PATH
        File takenPhotoFile = new File(tempUri.toString());

        mOnPhotoReceived.getImagePath(takenPhotoFile.getPath());
        getDialog().dismiss();
    }

    /*
    Results when selecting new image from phone memory
     */
    if(requestCode == Permissions.PICK_FILE_REQUEST_CODE && resultCode == Activity.RESULT_OK){
        Log.d(TAG, "onActivityResult: done choosing image");

        Uri selectedImageUri = data.getData();
        File file = new File(selectedImageUri.toString());
        Log.d(TAG, "onActivityResult: images: " + file.getPath());


        //send the bitmap and fragment to the interface
        mOnPhotoReceived.getImagePath(file.getPath());
        getDialog().dismiss();

    }
}

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

затем передача слушателя на занятие.

1 Ответ

0 голосов
/ 04 мая 2018

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

Во-вторых, добавьте эту строку перед вызовом startActivity():

emailIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

Это передает ваше разрешение на чтение любому приложению, обрабатывающему это Intent.

...