Совместное использование изображения с помощью ShareActionProvider

Я пытаюсь поделиться загруженным растровым изображением через ShareActionProvider Android, и у меня возникла проблема с фактической передачей растрового изображения в соответствующие приложения (такие как Messenger, Google+, Gmail). Когда я передаю намерение с uri, ничего не происходит (изображение не заполняется в стороннем приложении).

Вот мое намерение:

    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/*");
    writeToDirectory(bitmap, "cached-image.png"); // write bitmap to file system in order to share
    intent.putExtra(Intent.EXTRA_STREAM, getFileUri("cached-image.png"))
    mShareActionProvider.setShareIntent(intent);

В настоящее время я сохраняю растровое изображение в файл, используя следующее:

public String writeToDirectory(Bitmap bitmap, String filename) {
    assert context != null;
    assert bitmap != null;
    assert filename != null;

    // Ensure directory exists and create if not
    String path = Environment.getExternalStorageDirectory() + File.separator + "myApp";
    File f = new File(path);
    boolean dirExists = f.isDirectory();

    if (!f.isDirectory() && !f.exists()) {
        dirExists = f.mkdirs();
    }


    if (dirExists) {
        File file = new File(sharedPrivateExternalPath, filename);
        try {
            FileOutputStream out = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.close();
        } catch (IOException ex) {
            e(TAG, "Write failed!");
            e(TAG, ex.getMessage());
            ex.printStackTrace();
        }
        return file.toString();
    } else {
        return "";
    }
}

и я получаю Uri с помощью этого метода

public Uri getFileUri(String filename) {
    assert context != null;
    assert filename != null;

    String path = Environment.getExternalStorageDirectory() + File.separator + "myApp";
    File file = new File(path, filename);
    return Uri.fromFile(file);
}

Я проверил, что файл записывается в нужное место (Uri - это file:///storage/emulated/0/myApp/cached-image.png), и смог просмотреть изображение там (сделал adb pull с устройства), хотя изображение не передается. Я не вижу никаких ошибок в журнале (никаких исключений FileNotFoundException или чего-то в этом роде). Это проблема с правами доступа к файлам? Я не могу поделиться в «закрытом» месте?

Если я заменю getExternalStorageDirectory() + File.separator + "myApp"; на обычный getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), все будет работать нормально... но меня это беспокоит, иначе не получится :).

Любая помощь будет здорово!


person loeschg    schedule 11.02.2014    source источник
comment
Я не понимаю проблемы, вам нужно поделиться путем изображения или что?   -  person mohammed momn    schedule 12.02.2014
comment
Извините, вопрос был немного расплывчатым. Я обновил свой вопрос, но я также нашел свою проблему.   -  person loeschg    schedule 12.02.2014


Ответы (1)


Оказывается, это было связано с кодом, который я не публиковал (сюрприз, сюрприз). Я пытался установить shareIntent в setOnShareTargetSelectedListener... что, по-видимому, вы не можете сделать.

Моя проблема была с этим фрагментом кода

mShareActionProvider = (ShareActionProvider)
            MenuItemCompat.getActionProvider(shareItem);
    mShareActionProvider.setOnShareTargetSelectedListener(new ShareActionProvider.OnShareTargetSelectedListener() {
        @Override
        public boolean onShareTargetSelected(ShareActionProvider shareActionProvider, Intent intent) {
            String urlKey = mImageUrlList.get(mImageGallery.getCurrentItem()) + "\n";

            // This is the problem line
            mShareActionProvider.setShareIntent(getImageIntent(app.getImageCache().get(urlKey)));

            return false;
        }
    })
person loeschg    schedule 11.02.2014