14

画像を画像ビューで共有したいのですが、SDカードに保存したくありません。しかし、インテントを使用して共有する場合は、コードを使用しました

Intent share = new Intent(Intent.ACTION_SEND);
                share.setType("image/jpeg");
                share.putExtra(Intent.EXTRA_STREAM,Uri.parse(path));
                startActivity(Intent.createChooser(share, "Share Image"));  

ここでパス指定されたSDカード内の画像の場所

しかし、私は画像を保存したくありません...可能性はありますか..

4

3 に答える 3

28

他のアプリとファイルを共有するための推奨される方法は、FileProviderと呼ばれるContentProviderを使用することです。ドキュメントはかなり良いですが、いくつかの部分は少しトリッキーです。これが要約です。

マニフェストでFileProviderを設定します

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

com.example.myappアプリのパッケージ名に置き換えます。

res / xml/filepaths.xmlを作成します

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="shared_images" path="images/"/>
</paths>

これは、ファイルを共有する場所をFileProviderに指示します(この場合はキャッシュディレクトリを使用します)。

画像を内部ストレージに保存します

// save bitmap to cache directory
try {

    File cachePath = new File(context.getCacheDir(), "images");
    cachePath.mkdirs(); // don't forget to make the directory
    FileOutputStream stream = new FileOutputStream(new File(cachePath, "image.png")); // overwrites this image every time
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    stream.close();

} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

画像を共有する

File imagePath = new File(context.getCacheDir(), "images");
File newFile = new File(imagePath, "image.png");
Uri contentUri = FileProvider.getUriForFile(context, "com.example.app.fileprovider", newFile);

if (contentUri != null) {

    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // temp permission for receiving app to read this file
    shareIntent.setDataAndType(contentUri, getContentResolver().getType(contentUri));
    shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
    startActivity(Intent.createChooser(shareIntent, "Choose an app"));

}

参考文献

于 2015-05-11T15:54:20.063 に答える
5

私はこれを行うことができました:

File file = new File( getCacheDir(), "screenshot.png");
...
file.setReadable(true, false);
Uri uri = Uri.fromFile(file);
...
intent.putExtra(Intent.EXTRA_STREAM, uri);

このようにして、ファイルを自分のキャッシュフォルダーに保存するので、パブリックフォルダーをだましたり、SDカードが存在することに依存したりすることはありません。

また、この方法では、ユーザーがアプリを削除すると自動的に削除されますが、startActivityForResult / onActivityResultを使用してファイルを削除し、共有が終了したときにそのフォルダーをプライベートに戻しました。

(個人的には、ビットストリームを共有し、ファイルを作成する手順を完全に回避する方法を見つけたいと思っていましたが、それは不可能だと思います。)

[編集:ファイルがfile:/// mnt/sdcardにある必要がある2.3.6ではこれが機能しないことを発見しました。]

于 2013-06-06T22:22:43.750 に答える
2

メディアギャラリーコンテンツプロバイダーURIとして共有することもできます(画像がすでに電話にある場合、またはWebからのものである場合は、URLを共有できます(同じ効果ではありませんが)。

しかし、Webから来て、Bitmapに直接デコードし、それを適切な画像として共有したい場合は、ええ、本当にファイルが必要です!

于 2012-12-20T10:36:24.720 に答える