1

私はAndroidアプリを開発していますが、特定の時点で、ユーザーが.csvファイルを電子メールで送信できるようにしたいと考えています。Web で多くのチュートリアルを見てきましたが、それらはすべて同じコードであり、何度も試した同じコードです。問題は、電子メールの送信アクティビティが開始され、添付ファイルが電子メールに表示されますが、送信時にファイルまたは宛先が空になるか、宛先にまったく表示されないことです。

ここにいくつかのコードがあります:

File file = null;
File dir = ProjectViewerResume.this.getCacheDir();
if (dir.canWrite()){
    file = new File(dir, ProjectViewerResume.this.mProject.getName()+".csv");
    FileOutputStream out = new FileOutputStream(file);
    out.write(csv.toString().getBytes());
    out.close();
}
Uri u1 = null;

u1 = Uri.fromFile(file);

Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Project Resume: "+
                ProjectViewerResume.this.mProject.getName());
sendIntent.putExtra(Intent.EXTRA_STREAM, u1);
sendIntent.setType("text/csv");
startActivity(sendIntent);

csv 変数には、csv 形式のファイル コンテンツがあります。コードがきれいに見えるように、try..catch を省略しました。

よろしくお願いします

4

3 に答える 3

0

あなたはこれを試すことができます...

Intent sendIntent = new Intent(Intent.ACTION_SEND);
    sendIntent.setType("text/plain");
    sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject of Email");
    sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("/mnt/sdcard/file.csv"));
    sendIntent.putExtra(Intent.EXTRA_TEXT, "Enjoy the mail");
    startActivity(Intent.createChooser(sendIntent, "Email:"));    

ファイルの添付で問題が発生した場合は、次のパスを試してください。

sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/file.csv"));
于 2012-04-21T11:53:47.953 に答える
0

このコードは今私のために働いています。
openFileOutput の代わりに createTempFile を使用します。以前のアプローチの何が問題だったのかはまだわかりません。今回は空ではないLogCat.log.gzip
という名前のファイルが添付され、そこに私が挿入したデータが含まれています。

        public void run() {
            Uri uriLog = null;
            try {
                File gzipFile = File.createTempFile("LogCat.log", ".gzip");
                FileOutputStream out = new FileOutputStream(gzipFile);
                out.write(gzip(dump().getBytes()));
                out.close();
                uriLog = Uri.fromFile(gzipFile);
            }
            catch (IOException e) {
                e.printStackTrace();
            }

            Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
            emailIntent.setType("text/plain");
            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Android Log");
            emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, dump());
            emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, uriLog);
            try {
                String str = getResources().getString(R.string.send_prompt);
                Intent chooser = Intent.createChooser(emailIntent, str);
                startActivity(chooser);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();

次の行をマニフェストに追加することを忘れないでください。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2012-05-11T12:48:44.860 に答える
0

私はまったく同じ問題を抱えています。同じ投稿を複製しないように、私のコードをお見せしたいと思います。これはあなたのものとは少し異なりますが、それでも 0KB の添付ファイルを含む電子メールを送信します。
ログに 2 つのメッセージを出力します。

  • パスが出力されます(パッケージ名を編集しました)
  • ファイルのサイズが 0KB ではありません!!!

    05-11 11:32:58.133: W/Log Viewer(432): Path is /data/data/<package>/files/LogCat.log.gzip
    05-11 11:32:58.192: W/Log Viewer(432): The file is 504 bytes
    

    Eclipse デバッガーを使用してコード内で停止し、uriLog を調べました。null ではなく、正しいパスが含まれています。

    コードは次のとおりです。

            public void run() {
                Uri uriLog = null;
                try {
                    FileOutputStream out = openFileOutput("LogCat.log.gzip", Context.MODE_PRIVATE);
                    out.write(gzip(dump().getBytes()));
                    out.close();
                    File gzipFile = new File(getFilesDir(), "LogCat.log.gzip");
                    //uriLog = Uri.parse("file://" + getFilesDir() + "/LogCat.log.gzip");
                    uriLog = Uri.fromFile(gzipFile);
                    Log.w(TAG,"Path is " + uriLog.getPath());
                    Log.w(TAG,"The file is " + gzipFile.length() + " bytes");
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
    
                Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
                emailIntent.setType("text/plain");
                emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Android Log");
                emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, dump());
                emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, uriLog);
                try {
                    String str = getResources().getString(R.string.send_prompt);
                    Intent chooser = Intent.createChooser(emailIntent, str);
                    startActivity(chooser);
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    

    私が試したこと:

  • 解析によって uri を作成しました (コメント行を参照してください)
  • また、データが存在することを確認するためにメール本文内にデータを入れます->メールに届きます
  • 私はまた、gzipされたデータを電子メールの本文に入れて、それが存在することを確認しようとしました->電子メールで到着しました
    編集:
  • /mnt/system/app/CustomLocale.apk から、エミュレーターで既存のファイルを送信しようとしました
    23745 バイト uriLog.getPath() からのパスは /apk/CustomLocale.apk
    と出力され、メールはまだ、 CustomLocale.apk と 0KB のサイズ
    エミュレーターのスクリーンショット

    私が失敗しているのは、 putextra(intent.EXTRA_STREAM,uri) が基づいていることだけです

    public Intent putExtra (String name, Parcelable value) 
    

    およびurisは、parcelable インターフェースを実装します。しかし、私が調査する何らかの理由で、writeToParcel(Parcel out, int flags)の呼び出しがファイル データを書き出していない可能性があります。そのため、添付ファイルでは 0KB になっています。

  • 于 2012-05-11T08:53:46.033 に答える