14

最終的な目的はすぐに明らかになります。

ファイル オブジェクトを作成したいのですが、実際の物理ファイルからデータを取得する代わりに、自分でバッファーを提供したいと考えています。

次に、sdcard またはアプリの外部には実際には存在しないこのファイルを使用し、名前を付けて、添付ファイルとして電子メールで送信します (EXTRA_STREAM を使用)。

Adriaan Koster (@adriaankoster) による次のコードを見つけました。投稿Write byte[] to File in Java

// convert byte[] to File
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
File fileFromBytes = (File) ois.readObject();
bis.close();
ois.close();

System.out.println(fileFromBytes);

私はそれを使ってこの関数を作成しました

private File fileFromBytes(byte[] buf) {
    File f = null;
    try {
        ByteArrayInputStream bis = new ByteArrayInputStream(buf);
        ObjectInputStream ois = new ObjectInputStream(bis);
        f = (File) ois.readObject();
        bis.close();
        ois.close();
    }
    catch (Exception e) {}
    return f;
}

私がそれを使用するとき、ここが私が立ち往生している場所です:

// When sent as body the mail is sent OK
// emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, dump());

// When I try to attach the mail is empty
emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, fileFromBytes(dump().getBytes()));

例からわかるように、2 番目の引数は URI である必要がありますが、ファイルに合わせて仮想URI を作成するにはどうすればよいですか?

編集: アプリケーション内から直接データを添付するオプションは、特定の種類のアプリケーションにとって重要です。つまり、機密データをあまり移動したくないセキュリティおよびバンキング アプリケーションです。確かに、データが SD カードに届かず、メールの添付ファイルに直接送られる場合、アプリケーション メモリ内よりも傍受するのが難しくなります。
これは私の特定のケースではありませんが、この機能が重要であることを指摘したいと思います。

4

4 に答える 4

6

最初にやりたいことは、ContentProvider を作成することだと思います。ここで実装例を見ることができます

https://github.com/dskinner/AndroidWeb/blob/master/src/org/tsg/web/WebContentProvider.java

上記のリンクの場合、これを AndroidManifest.xml に追加します

<provider
    android:name="org.tsg.web.WebContentProvider"
    android:authorities="your.package.name" />

これで、コンテンツ URI を使用できるようになりますcontent://your.package.name/

あなたが興味を持っている上記の ContentProvider の部分は、openFileメソッドです。アプリ間で意図的にデータを共有する場合、特定のことが予想されます。あなたの場合、電子メールに添付されることを意図したバイトデータを共有しようとしています。

content://your.package.name/fooそのため、適切なインテント フラグなどを使用してメール アプリにコンテンツ URI を渡すとopenFile、ContentProvider で呼び出されます。この場合、URI セグメントの最後を検査して、foo要求されたことを確認し、適切に返すことができます。

次に取り上げる問題は、ファイルが実際にディスク上にないことです。上記で使用した方法を保証することはできませんが (コーシャに見えますが)、返す必要があるのはParcelFileDescriptorContentProvider からのものです。私が提供したリンクを見ると、Fileオブジェクトからファイル記述子を取得するためのサンプルとしてそれを使用しようとする可能性があります (私の知識はここで放棄します) が、その時点でデータを利用できないと思います。

ただし、あなたが持ち出すのはセキュリティです。アプリのみがデータにアクセスできるように、プライベートにデータをディスクに書き込むことができることに注意することが重要です。私は信じていますが、これを再確認することをお勧めします。そのデータがアプリにプライベートである場合は、ContentProvider を介して公開し、プロバイダーを誰がどのように使用するか、誰が呼び出すことができるかなどをロックできます。その部分のAndroidドキュメントを掘り下げたり、他のSOの質問を見たりしたい.

とにかく、頑張ってください。

于 2012-06-02T05:52:55.377 に答える
1

アプリケーションのキャッシュ ディレクトリにファイルを作成します。内部ファイルシステムに作成されます。キャッシュ ディレクトリへのパスを取得するには、'getCacheDir()' API を使用します。このディレクトリにデータを書き込み、「 Uri.fromFile (File file) 」を使用して File オブジェクトから URI を取得します。ファイルの処理が終了したら、ファイルを削除します。

アプリケーションのキャッシュはアプリでのみ使用できるため、目的に合わせて安全に使用できます。

データが重要すぎる場合は、暗号化を行うことができます。

于 2012-05-29T18:30:31.367 に答える
1

これを行うには、URI を処理できるようにする ContentProvider を公開する必要があると思います。その後、電子メール アプリケーションは URI で InputStream を開く必要があります。その時点で、メモリ内データで InputStream を返します。

私はそれを試していませんが、理論的にはこれでうまくいくはずです。

于 2012-06-01T12:56:28.947 に答える
0

メールに添付ファイルを追加するのに忙しかったので、添付ファイル付きのメールを送信できます。ご覧になりたい場合:Androidで添付ファイル付きのメールを送信できません

于 2012-05-09T18:08:18.587 に答える