Android studio - изо всех сил пытается поделиться изображениями / аудио / видео файлами из ресурсов приложения - PullRequest
1 голос
/ 21 января 2020

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

  • Попробуйте использовать пользовательский контент-провайдер ( здесь или здесь , ..)
  • Попробуйте сохранить файл в локальном хранилище (пример здесь )
  • и другие, но так как это не сработало, у меня больше нет ссылок ..

Прямо сейчас, вот мое рабочее решение для обмена аудиофайлами только с WhatsApp и Messenger, все остальные приложения не работают).

Моя функция для создания нового файла в хранилище приложения:

public String getNewPathFromSbElem(SbElem sbElem, String fileName) {
    AssetManager assetManager = getAssets();
    String path = sbElem.soundPath;
    String newName = fileName;
    String newPath = getExternalFilesDir(null).getAbsolutePath() + File.separator + newName;
    InputStream in = null;
    OutputStream out = null;
    File outFile;

    File deleteFile = new File(newPath);
    if(deleteFile.exists()) {
        deleteFile.delete();
    }

    try {
        in = assetManager.open(path);
        outFile = new File(getExternalFilesDir(null), newName);
        out = new FileOutputStream(outFile);
        copyFile(in, out);
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        if (out != null) {
            try {
                out.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
    return newPath;
}

Мои две функции для совместного использования в WhatsApp или Messenger:

public void shareOnWhatsApp(SbElem sbElem) {
    final String newPath = getNewPathFromSbElem(sbElem, "_share_temp_file.mp3");
    Intent whatsappIntent = new Intent(Intent.ACTION_SEND);
    whatsappIntent.setPackage("com.whatsapp");
    whatsappIntent.setType("audio/mp3");
    whatsappIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(newPath));
    whatsappIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

    try {
        startActivity(whatsappIntent);
    } catch (android.content.ActivityNotFoundException ex) {
        Log.d("error", "WhatsApp not installed");
    }
}

public void shareOnMessenger (SbElem sbElem) {
    final String newPath = getNewPathFromSbElem(sbElem, "_share_temp_file.mp3");
    final File newFile = new File(newPath);
    final Uri newUri = FileProvider.getUriForFile(this, getString(R.string.file_provider_authority), newFile);
    final Integer SHARE_TO_MESSENGER_REQUEST_CODE = 1;

    String mimeType = "audio/*";
    ShareToMessengerParams shareToMessengerParams = ShareToMessengerParams.newBuilder(newUri, mimeType).build();
    MessengerUtils.shareToMessenger(this, SHARE_TO_MESSENGER_REQUEST_CODE, shareToMessengerParams);
}

Дело в том, что я хотел бы иметь возможность поделиться из моей папки активов .mp3 , .jpg, .png, в Gmail, WhatsApp, Slack, или любое другое приложение, которое поддерживает это расширение ...

Так как почти все 1000 вопросов / статей в Интернете, касающихся Ответы на ресурсы совместного использования получены с помощью пользовательского поставщика содержимого. Я попытался использовать следующую функцию :

public void shareBasic () {
    // I added the test.jpg in the root of my asset folder
    // Tried with content / file / 2 or 3 '/', with package name and with assets / ...
    Uri theUri = Uri.parse("content:///com.MY_PACKAGE_NAME/test.jpg");
    //Uri theUri = Uri.parse("content:///assets/test.jpg");
    //Uri theUri = Uri.parse("file:///com.MY_PACKAGE_NAME/test.jpg");
    //Uri theUri = Uri.parse("file:///asset.jpg");
    Intent theIntent = new Intent(Intent.ACTION_SEND);
    // Tried with jpeg / png / jpg ...
    theIntent.setType("image/*");
    theIntent.putExtra(Intent.EXTRA_STREAM, theUri);
    theIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(theIntent);
}
* 103 5 * А вот и мой Android манифест :
    <provider
        android:name="MY_PACKAGE_NAME.MyContentProvider"
        android:authorities="MY_PACKAGE_NAME"
        android:grantUriPermissions="true"
        android:exported="true" />

И провайдер файлов (почти одинаковый в каждом уроке)

public class MyContentProvider extends ContentProvider {
    @Override
    public boolean onCreate() {
        return true;
    }

    @Override
    public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Override
    public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal )
    {
        // TODO: Implement this method
        return super.query( uri, projection, selection, selectionArgs, sortOrder, cancellationSignal );
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
        AssetManager am = getContext().getAssets();
        String fileName = uri.getLastPathSegment();
        if(fileName == null)
            throw new FileNotFoundException();
        AssetFileDescriptor fileDescriptor = null;
        try {
            fileDescriptor = am.openFd(fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileDescriptor;
    }
}

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

1 Ответ

0 голосов
/ 21 января 2020

Для вашего ContentProvider решения:

  • Вам необходимо, чтобы ваша функция query() поддерживала OpenableColumns

  • Вам нужно чтобы ваша getType() функция возвращала фактический тип MIME

  • Ваш Intent должен использовать конкретный тип MIME, а не подстановочный знак

См. этот старый пример проекта для демонстрации.

...