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

Поделиться изображением холста на Android

Привет, поэтому я пишу небольшую игру, где в конце вы можете поделиться своим результатом. Результат записывается на изображение с помощью холста. Проблема в том, что при совместном использовании я получаю сообщение об ошибке "Ошибка, не удалось найти файл". Ошибка видна только на экране и не отражается в logcat. Я уже потратил бесчисленное количество часов, пытаясь решить эту проблему, но, похоже, ничего не работает. Я не получаю никаких ошибок, но файл по-прежнему кажется невозможным для совместного использования. У кого-нибудь есть предложения, почему это не работает?

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

Часть рисования на холсте тестировалась отдельно, и я смог поделиться растровым изображением на Facebook, используя библиотеку fb. К сожалению, собственный общий ресурс Android не позволяет обмениваться растровыми изображениями без их сохранения.

В манифесте у меня есть разрешения на запись и чтение как для внутреннего, так и для внешнего хранилища. Буду очень признателен за любую помощь.

Кнопка «Поделиться» на прослушивателе кликов:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.Myimage); 
                mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
                Canvas canvas = new Canvas(mutableBitmap);
                Paint paint = new Paint();
                paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
                paint.setColor(Color.BLACK);
                paint.setTextSize(170);

                int top_margin = 1000;
                int left_margin = 1700;

                canvas.drawText("You got a ton of points", left_margin, top_margin, paint);

ActivityCompat.requestPermissions(test_process.this,
                            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},1);

Результат разрешения:

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                sharethis(mutableBitmap);
            } else {
                Toast.makeText(test_process.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
            return;
        }
    }
}

Поделиться методом:

public void sharethis(Bitmap bitmap){

    File file_path = getFilesDir();

    File file = new File(file_path, "resultImg.jpg");
    FileOutputStream fOut;
    try {
        fOut = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fOut);
        fOut.flush();
        fOut.close();
    } catch (Exception e) {
        e.printStackTrace();
        Log.i("file saving problem", String.valueOf(e));
    }

    Uri uri = Uri.fromFile(file);
    Uri uriContent = getImageContentUri(this, file);

    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setType("image/jpeg");
    Log.i("Uri", String.valueOf(uri));
    Log.i("UriContent", String.valueOf(uriContent));
    intent.putExtra(Intent.EXTRA_STREAM, uriContent);
    startActivity(Intent.createChooser(intent, "Share Cover Image"));
}

И конвертер URI:

public static Uri getImageContentUri(Context context, File imageFile) {
    String filePath = imageFile.getAbsolutePath();
    Cursor cursor = context.getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            new String[] { MediaStore.Images.Media._ID },
            MediaStore.Images.Media.DATA + "=? ",
            new String[] { filePath }, null);

    if (cursor != null && cursor.moveToFirst()) {
        int id = cursor.getInt(cursor
                .getColumnIndex(MediaStore.MediaColumns._ID));
        Uri baseUri = Uri.parse("content://media/external/images/media");
        return Uri.withAppendedPath(baseUri, "" + id);
    } else {
        if (imageFile.exists()) {
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.DATA, filePath);
            return context.getContentResolver().insert(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        } else {
            return null;
        }
    }
}
11.09.2017

Ответы:


1

getImageContentUri() не будет работать. Ваш файл находится на внутреннем хранилище; сторонние приложения, включая MediaStore, не имеют к нему доступа.

Избавьтесь от getImageContentUri(). Настройте FileProvider для обслуживания файлов из getFilesDir(). Затем используйте FileProvider.getUriForFile(), чтобы получить Uri, который вы можете использовать в своем ACTION_SEND Intent.

Также:

  • Вам нужно будет добавить FLAG_GRANT_READ_URI_PERMISSION к ACTION_SEND Intent

  • Вам не нужно READ_EXTERNAL_STORAGE ни для чего из этого

11.09.2017
  • вместо FileProvider (и сохранения Bitmap в физическом файле) вы пытались настроить ContentProvider и переопределить метод openFile? 11.09.2017
  • Спасибо за ваши объяснения. Оно работает. Просто, если кто-то будет искать это решение, путь к файлу, который я использовал, выглядит следующим образом: ‹files-path name=files path=./› . Мне потребовалось некоторое время, чтобы понять это. 11.09.2017
  • Новые материалы

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

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

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

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

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

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

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