Поделиться Намерение Google+ не может получить доступ к изображению - PullRequest
14 голосов
/ 30 марта 2012

Я вызываю намерение поделиться изображением. это работает с большинством провайдеров, НО с Google+. Google+ открывает публикацию действий без изображения и отображает тост «Вы можете публиковать только фотографии, хранящиеся на вашем устройстве». в то же время.

    File f = storeImage(image); // f = /data/data/com.myapp/files/1333070776978.jpg
    Uri uri = Uri.fromFile(f);

    Intent share = new Intent(Intent.ACTION_SEND);
    share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    share.setType("image/jpeg");
    share.putExtra(Intent.EXTRA_STREAM, uri);
    share.putExtra(Intent.EXTRA_TITLE,"Share that title");
    share.putExtra(Intent.EXTRA_SUBJECT,"Share that subject");
    share.putExtra(Intent.EXTRA_TEXT,"Check that out...");
    share.putExtra("sms_body", "sms body");
    startActivity(Intent.createChooser(share, "Share Image"));

я сохраняю изображение с

    Context.openFileOutput(fileName, Context.MODE_WORLD_READABLE);

Насколько я понимаю, установив FLAG_GRANT_READ_URI_PERMISSION, я даю Google+ определенный доступ к этому файлу.

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

    ContentValues values = new ContentValues(2);
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    values.put(MediaStore.Images.Media.DATA, f.getAbsolutePath());
    Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

ценится любой совет

Simon

Ответы [ 5 ]

6 голосов
/ 02 июня 2014

Google + не может получить доступ к file:// Uris из личной папки другого приложения.И FLAG_GRANT_READ_URI_PERMISSION в этом случае не работает, потому что он предназначен только для Uris в части «данных» Intent, но не для дополнительных.

Один из распространенных способов - добавить его в галерею (черезMediaStore) но это не обязательно.Правильным решением в этом случае является использование FileProvider:

FileProvider - это специальный подкласс ContentProvider, который обеспечивает безопасный общий доступ к файлам, связанным с приложением, путем создания content:// Uri для файла вместо file:/// Uri.

Сначала поместите следующее в свой AndroidManifest.xml

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.myapp.testshare.fileprovider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths" />
</provider>

Затем этот файл в res\xml\filepaths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="shared_images" path="shared_images/" />
</paths>

Затем, чтобы поделиться файлом изображения, убедитесь, что он находится по указанному выше пути (то есть shared_images в getFilesDir()), и создайте намерение следующим образом:

File file = getImageFileToShare();
Uri fileUri = FileProvider.getUriForFile(this, "com.myapp.testshare.fileprovider", file);

Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, fileUri);
intent.setType("image/png");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

startActivity(intent);

(Убедитесь, что права доступа, указанные в методе getUriForFile(), совпадают с полномочиями, указанными в манифесте.)

Это создаст content:// Uri (например, content://com.myapp.testshare.fileprovider/shared_images/img1.png, к которому приложение Google+ сможет получить доступ, ипри этом включите в пост).

2 голосов
/ 01 апреля 2012

Simon,

Похоже, что он работает, чтобы установить разрешение после установки URI.

share.putExtra(Intent.EXTRA_STREAM, uri);
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
1 голос
/ 25 ноября 2013

Если вы используете пользовательский ContentProvider, вы должны убедиться, что MIME-тип изображений правильный.Правильный MIME для jpeg - это «image / jpeg».Если вы вернете «image / jpg» в переопределенном getType (Uri uri);метод, то Google+ не может присоединить их.Большинство других работ, например, обмен сообщениями и электронная почта.«image / jpg» НЕ является допустимым типом IANA MIME:

http://www.iana.org/assignments/media-types/image

Спецификация getType ясна по этому поводу, но ее очень легко пропустить (я так и сделал).Решив это, я хотел, чтобы другие заметили это, потому что это очень неубедительно.

1 голос
/ 20 августа 2012

попробуйте этот, у меня также есть проблемы с этим, так как он появляется в Галерее, если я делаю вставку ..

// здесь находится экземпляр файла

String uriString = MediaStore.Images.Media.insertImage(getContentResolver(),
               out.getAbsolutePath(),null,null);   
intent.putExtra(Intent.EXTRA_STREAM,Uri.parse(uriString));

https://github.com/google-plus/google-plus-office-hours/blob/master/2012_08_14-curiosity-android-app/src/com/example/CuriosityActivity.java

0 голосов
/ 15 октября 2015

Вы можете использовать это:

Drawable drawable;
File file;
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
    drawable = getResources().getDrawable(imgResId);
} else {
    drawable = getResources().getDrawable(imgResId, null);
}

if (drawable != null) {
    Bitmap bm = ((BitmapDrawable) drawable).getBitmap();

    String path = Environment.getExternalStorageDirectory()
            .toString();
    OutputStream fOut = null;
    file = new File(path, "pic.jpg"); // the File to save to
    try {
        file.createNewFile();
        fOut = new FileOutputStream(file);

        // obtaining the Bitmap
        bm.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
        fOut.flush();
        fOut.close();
        return file;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
} 
...