4

アプリで画像を作成し、これらのソーシャルネットワーク(Facebook)、メールアプリ(Gmail)、および画像を「受信」できるその他のアプリを共有したいと考えています。

問題の原因は(私が思うに)、外部ストレージを画像のベースとして使用したくないということです。データフォルダまたはキャッシュフォルダのどちらにもアクセスするためのアクセス許可が必要ないため、どちらも使用したいと思います。

画像をファイルに書き込むために使用するコード(およびMODE_WORLD_READABLE他のアプリが画像を読み取れるように指定します):

FileOutputStream fos = null;
try {
    fos = context.openFileOutput("image.jpg", Context.MODE_WORLD_READABLE);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
} finally {
    if (fos != null)
        fos.close();
}

そして、これは私が画像を共有するコードです:

File internalFile = context.getFileStreamPath("image.jpg");

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(internalFile));
intent.setType("image/jpeg");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

context.startActivity(Intent.createChooser(intent, "share"));

このソリューションは非常に簡単で、Facebookなどのアプリでは正常に機能しますが、次の場合に失敗するGmailなどでは機能しません。

file:// attachment paths must point to file:///mnt/sdcard

Gmailで動作させるための「ハック」(以下を参照)はたくさんありますが、ハッキングなしで動作する画像を共有するためのさらに良い方法があるかどうかを自問自答します。これは私が見落としていたものです。だから、質問に:

  • 画像を共有するための最良の方法は何ですか?(外部記憶装置?)
  • Gmailのように(誤)動作するアプリは他にありますか?(私はグーグル+でいくつかの問題を見ました)
  • 他に方法がない場合:特定のアプリと共有するための特別なインテントを作成できますか?ユーザーがウォッチリストでアプリを選択したときに共有してオーバーライドするデフォルトの方法がありますか?

ハック

  1. パスハックを使用するには、次のポイントを指定するだけですUri

    file:/// mnt / sdcard / .. / .. / my / package / name/..。

    この解決策は正しくないと感じています。

  2. ContentProviderここで説明されているようにを使用します。しかし、リンクから引用:

    警告:投稿で説明されている方法はGmailでうまく機能しますが、他のACTION_SENDハンドラー(MMSコンポーザーなど)に問題があるようです。

    (問題:MMSコンポーザーがクラッシュします)

4

2 に答える 2

0

ParecelableFileDescriptor を試しましたか?

http://developer.android.com/reference/android/os/ParcelFileDescriptor.html

Create with static ParcelFileDescriptor open(File file, int mode, Handler handler, ParcelFileDescriptor.OnCloseListener listener) 指定されたファイルにアクセスする新しい ParcelFileDescriptor を作成します。 static ParcelFileDescriptor open(File file, int mode) Create a new ParcelFileDescriptor accessing a given file.

このような受信者側: Androids DownloadManager を使用してパーセル ファイル記述子から入力ストリームを返す

于 2013-12-13T06:44:34.890 に答える
0

3つのステップを実行する必要があります。
写真を撮る。

public Bitmap takeScreenshot() {
    View rootView = findViewById(android.R.id.content).getRootView();
    rootView.setDrawingCacheEnabled(true);
    return rootView.getDrawingCache();
}

画像を保存する。

public String saveBitmap(Bitmap bitmap) {

File imagePath = new File(Environment.getExternalStorageDirectory() + “/screenshot.png”);
    FileOutputStream fos;
    try {
        fos = new FileOutputStream(imagePath);
        bitmap.compress(CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        Log.e(“GREC”, e.getMessage(), e);
    } catch (IOException e) {
        Log.e(“GREC”, e.getMessage(), e);
    }

    return imagePath.getAbsolutePath();
} 

ソーシャル ネットワークに共有します。

于 2014-09-24T09:35:38.333 に答える