14

私は画像を共有する意図を呼んでいます。これはほとんどのプロバイダーで機能しますが、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);

アドバイスをいただければ幸いです

サイモン

4

5 に答える 5

6

Google+はfile://、別のアプリケーションのプライベートフォルダからURIにアクセスできません。また、FLAG_GRANT_READ_URI_PERMISSIONこの場合は機能しません。これは、インテントの「データ」部分にあるURIのみが対象であり、追加機能は対象外であるためです。

一般的な回避策の1つは、(を介して)ギャラリーに追加することMediaStoreですが、そうする必要はありません。この場合の正しい解決策は、FileProvider:を使用することです。

content://FileProviderは、ContentProviderの特別なサブクラスであり、Uriの代わりにファイルのUriを作成することにより、アプリに関連付けられたファイルの安全な共有を容易にし ますfile:///

まず、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.pngGoogle+アプリがアクセスできるようになり、投稿に含まれるようになります)。

于 2014-06-02T15:54:00.477 に答える
2

サイモン、

URIを設定した後、権限を設定するように機能しているようです。

share.putExtra(Intent.EXTRA_STREAM, uri);
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
于 2012-04-01T16:42:31.113 に答える
1

これを試してみてください。挿入するとギャラリーに表示されるので、これにも問題があります。

//ここにFileインスタンスがあります

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

于 2012-08-20T06:51:09.197 に答える
1

カスタムContentProviderを使用している場合は、画像のMIMEタイプが正しいことを確認する必要があります。jpegの正しいMIMEは「image/jpeg」です。オーバーライドされたgetType(Uri uri);で「image/jpg」を返す場合。その後、Google+はそれらを添付できません。他のほとんどの1つは機能します。たとえば、メッセージングや電子メールです。「image/jpg」は、有効なIANAMIMEタイプではありません。

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

getTypeの仕様はこれについて明確ですが、見逃しがちです(私はそうしました)。これを解決したので、他の人がこれを見つけられるようにしたかったのです。

于 2013-11-25T04:05:43.493 に答える
0

あなたはこれを使うことができます:

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();
    }
} 
于 2015-10-14T23:43:35.767 に答える