web-dev-qa-db-ja.com

Intent〜androidを介してキャッシュディレクトリから画像ファイルを共有する

キャッシュディレクトリで画像ファイルを共有しようとしています。完全なパスがありますが、添付ファイルでファイルを送信できません。コードは次のとおりです。

File shareImage=Utils.getBitmapFile();
Log.d("Activity", "get final path in result"+shareImage.getAbsolutePath());
/*MimeTypeMap mime = MimeTypeMap.getSingleton();
String ext=shareImage.getName().substring(shareImage.getName().lastIndexOf(".")+1);
String type = mime.getMimeTypeFromExtension(ext);
shareIntent.setType(type);
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
Uri shareImageUri = Uri.fromFile(shareImage);
Uri shareImageUri = Uri.fromParts("content", shareImage.getAbsolutePath(), null);//("content://"+shareImage.getAbsolutePath()); 
*/


Uri shareImageUri = Uri.fromFile(shareImage);
Log.d("Result ","uri is "+shareImageUri.toString());
shareIntent.putExtra(Intent.EXTRA_STREAM, shareImageUri);
startActivity(Intent.createChooser(shareIntent, "Share Results"));

上記のコメントコードが機能していません

送信メールには添付ファイルが表示されますが、受信側には添付ファイルがありません。Facebook共有でも投稿に画像が表示されません

これの理由は何ですか?

私はすでに次のSOリンク how-to-use-share-image-using-sharing-intent-to-share-images-in-Android と他の多くの人、それらのどれも問題を解決することができません

P.S。;

1.目的は、画面のスクリーンショットを撮り、キャッシュディレクトリに保存して、そこからオンラインで共有することです。

2.はい、ファイルはあります。デバイスからDDMSを介してプルし、システムで確認できます。

17
Akhil Jain

これの理由は何ですか?

前述のように、他のアプリはアプリの内部ストレージにアクセスできません。

それらのどれも問題を解決することができません

新しいStackOverflowの質問を開いて、完全かつ正確に試した特定の解決策と、発生した特定の問題について説明してください。

しかし、それはSO post !!!

新しいStackOverflowの質問を自由に開いて、完全かつ正確に「機能していないように見える」とはどういう意味かを説明します。

または、 se FileProvider は、マニフェストのエントリ以外にコードを必要とせずにこの機能を提供します。

または、getExternalCacheDir()などの外部ストレージに画像を保存します。

10
CommonsWare

@CommonsWareのアドバイスに従い、FileProviderを使用しました。イメージがすでにcache/images/image.pngとして内部キャッシュディレクトリにあると仮定すると、次の手順を使用できます。これらは主にドキュメントの統合です。

マニフェストで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に指示します(この場合はキャッシュディレクトリを使用)。

画像を共有する

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"));

}

ドキュメンテーション

55
Suragch

キャッシュされた画像を次の手順で共有します。

1.キャッシュされた画像をターゲットパスにコピーします。

public static File copyImage(String sourcePath、String targetPath){
試してみてください{
InputStream in = new FileInputStream(sourcePath);
OutputStream out = new FileOutputStream(targetPath);
byte [] buf = new byte [1024];
int len;
while((len = in.read(buf))> 0){
out.write(buf、0、len);
}
in.close();
out.close();
新しいファイル(targetPath);を返します。
} catch(IOException e){
e.printStackTrace();
nullを返します。
}
}

2.コピーファイルのURIを取得します。

Uri uri = Uri.fromFile(target);

3.意図的に画像を共有する

    File dir = new File(Constant.INKPIC_PATH);//your custom path,such as /mnt/sdcard/Pictures
    if(!dir.exists()){
        dir.mkdirs();
    }
    File f = new File(dir,"temporary_file.jpg");
    File target = copyImage(url,f.getAbsolutePath());
    Uri uri = Uri.fromFile(target);
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setType("image/*");
    intent.putExtra(Intent.EXTRA_STREAM,uri );
    context.startActivity(intent);
0
Guu