Android studio - Не удалось найти настроенный root, содержащий /data/data/com.example.app/app_Images/20-02-2020_093925.jpg - PullRequest
0 голосов
/ 20 февраля 2020

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

private void takePhoto() {

    output=new File(new File(getFilesDir(), PHOTOS), FILENAME);

    if (output.exists()) {
        output.delete();
    }
    else {
        output.getParentFile().mkdirs();
    }

    Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    Uri outputUri= FileProvider.getUriForFile(this, AUTHORITY, output);

    i.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);

    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
        i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    }
    else if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN) {
        ClipData clip=
                ClipData.newUri(getContentResolver(), "A photo", outputUri);

        i.setClipData(clip);
        i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    }
    else {
        List<ResolveInfo> resInfoList=
                getPackageManager()
                        .queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY);

        for (ResolveInfo resolveInfo : resInfoList) {
            String packageName = resolveInfo.activityInfo.packageName;
            grantUriPermission(packageName, outputUri,
                    Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        }
    }

    try {
        startActivityForResult(i, CONTENT_REQUEST);
    }
    catch (ActivityNotFoundException e) {
        Toast.makeText(this, "no camera", LENGTH_LONG).show();
        finish();
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putSerializable(EXTRA_FILENAME, output);
}


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

    if (requestCode == CONTENT_REQUEST) {
        if (resultCode == RESULT_OK) {
            Uri outputUri=FileProvider.getUriForFile(this, AUTHORITY, output);
            saveBitmap(getContactBitmapFromURI(this, outputUri));
            mData.add(new AttachedImage(FileName, FileSize,PathFromCamera));
            mAdapter.notifyDataSetChanged();

        }
    }

}

public Bitmap getContactBitmapFromURI(Context context, Uri uri) {
    try {

        InputStream input = context.getContentResolver().openInputStream(uri);
        if (input == null) {
            return null;
        }
        return BitmapFactory.decodeStream(input);
    }
    catch (FileNotFoundException e)
    {

    }
    return null;

}

public void saveBitmap(Bitmap bitmap){
    String timeStamp = new SimpleDateFormat("dd-MM-yyyy_HHmmss").format(new Date());
    ContextWrapper wrapper = new ContextWrapper(getBaseContext());
    File file = wrapper.getDir("Images",MODE_PRIVATE);
    file = new File(file, timeStamp+".jpg");
    try{
        OutputStream stream = null;
        stream = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);
        stream.flush();
        stream.close();
    }catch (IOException e)
    {
        e.printStackTrace();
    }
    Uri savedImageURI = Uri.parse(file.getAbsolutePath());
    PathFromCamera = savedImageURI.getEncodedPath(); //this will be returned with the getImage() method
    FileSize = String.valueOf((file.length()/1024)/1000) + " KB";
    FileName = file.getName();


}

Я хочу отправить электронное письмо с помощью этого OnClickListener:

mSubmit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent emailIntent = new Intent(Intent.ACTION_SEND);
            emailIntent.setType("text/plain");
            emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"email@example.com"});
            emailIntent.putExtra(Intent.EXTRA_SUBJECT, "example");
            emailIntent.putExtra(Intent.EXTRA_TEXT, mLocation.getText().toString() + "\n" + mSpinner.getSelectedItem().toString() + "\n" + mDetail.getText().toString());

            for (final AttachedImage img : mData) {
                //System.out.println(img.getImage());

                //Bitmap bitmap = BitmapFactory.decodeFile(img.getImage());
                File f = new File(img.getImage());
                Uri outputUri=FileProvider.getUriForFile(getApplicationContext(), AUTHORITY, f);

                emailIntent.putExtra(Intent.EXTRA_STREAM, outputUri);
            }

            startActivity(Intent.createChooser(emailIntent, "Pick an Email provider"));
        }
    });

. Функция .getImage () возвращает переменную PathFromCamera, которая была сохранена когда изображение было снято. Я знаю, что эта функция возвращает существующий путь, потому что я загружаю изображения в RecyclerView, и там он работает отлично. Код, который я использую в RecyclerViewAdapter для загрузки изображения, выглядит следующим образом:

AttachedImage currentItem = mData.get(position);
holder.mImageView.setImageBitmap(BitmapFactory.decodeFile(currentItem.getImage()));

Я храню все изображения в private List<AttachedImage> mData; AttachedImage - созданный пользовательский класс. У меня также есть провайдер файлов:

public class LegacyCompatFileProvider extends FileProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    return(new CursorWrapper(super.query(uri, projection, selection, selectionArgs, sortOrder)));
}
}

И файл xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>

    <files-path
        name="p"
        path="photos" />

</paths>

Файл My Manifest:

<provider
        android:name=".custom.LegacyCompatFileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...