数日間の調査と数え切れないほどの推測とチェックの後、私はついにすべてを理解しました。誰かがこれに遭遇して、私が持っていたのと同じ問題を抱えている場合に備えて、私は実際にすべてを説明するためにこの時間を取りたいと思います。うまくいけば、あなたが探しているものがすべてここにあり、あなた(そして私)がこれまでに訪れた他の何百ものサイトよりも良い説明をしました。
最初のトピックは、内部ストレージと外部ストレージの違いです(sdcardとsdcardの違いではありません)。
内部ストレージは、アプリケーション以外には誰も見ることもアクセスすることもできないものです。内部ストレージにファイルまたはフォルダーを作成する場合、ファイルブラウザー(ルート化されていない場合)またはコンピューターを使用して作成したものを確認することはできません。アプリケーションの外部からは完全にアクセスできません。
Documents / Downloads / Music / Ringtones/etcなどのパブリックフォルダ。技術的には外部ストレージにあります。書き込みと読み取りを行うには、アクセス許可が必要です。これは私が混乱していたところです。外部ストレージとしてカウントされるのはSDカードだけだと思いました。外部ストレージは、SDカード上にあるかどうかに関係なく、コンピューターまたはファイルブラウザーから手動でアクセスできるものです。
内部ストレージまたは外部ストレージにファイルを作成するために、mkDir()を使用する必要はありません。あなたがそう言う人は誰でも、物事を過度に複雑にしています。実際には、コードからシステム上の任意の場所に任意のテキストファイルを作成できます。
PrintWriter osw = new PrintWriter(Environment.getExternalStoragePublicDirectory(DOWNLOAD_SERVICE).toString() + "/output.txt");
これにより、ダウンロードディレクトリに最初に存在したかどうかに関係なく、ダウンロードディレクトリにテキストファイルが作成されます。getDataDirectory()またはファイルを作成する他の場所を使用することもできます。
次のLogcatは、他の人が指摘しているように、作成中にlogcatから読み取ろうとしていました。logcatに終わりはありません。そのため、実際には、アプリケーションは常に書き込みを探していたため、アプリケーションがハングしました。これを回避する簡単な方法は、logcatの-d機能を使用することです。これは、-dが入力された時点(まさに私が望んでいたもの)まですべてを取得し、それから停止し、それをバッファーに入れて、ハングすることなく出力を取得できるようにすることです。
最後に、ファイルを電子メールインテントに添付します。私に問題を与えることになったいくつかの異なる領域があったので、これはトリッキーでした。つまり、「添付ファイルを表示できませんでした」というエラーが表示された場合は、次の2つのいずれかを意味します。1。)内部メモリからファイルを添付しようとしています(他のプログラムはアクセスを許可されていません。内部メモリ、さらにはgmail)または2.)getAbsolutePath()を使用していません。uri.parse()を使用してファイルを添付できず、uri.fromFile()を使用する必要があると言った人がかなりいます。これは間違っています。添付ファイルを添付する方法を示しますが、エラー。
このコードがお役に立てば幸いです。また、私がこのことを理解しようとしていた時間の1/10を費やさないことを願っています。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Calendar;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mailb = (Button)findViewById(R.id.bmail);
final TextView confirmation = (TextView)findViewById(R.id.Confirmation);
mailb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
PrintWriter osw = new PrintWriter(Environment.getExternalStoragePublicDirectory(DOWNLOAD_SERVICE).toString() + "/output.txt"); //This creates a file in my public download directory
osw.println("Output Log: Report Tool");
osw.println("Date: " + java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime()));
osw.println("------------------------------------");
osw.println("Manufacturer: " + android.os.Build.MANUFACTURER);
osw.println("Model: " + android.os.Build.MODEL);
osw.println("Serial: " + android.os.Build.SERIAL);
osw.println("BootLoader: " + android.os.Build.BOOTLOADER);
osw.println("Build ID: " + android.os.Build.FINGERPRINT);
osw.println("------------------------------------");
try {
Process p = Runtime.getRuntime().exec("logcat -d -v long"); //This gets the dump of everything up to the button press
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
if(line.toString().contains("SIP_MESSAGE")){ //This parses out everything but SIP Messages
osw.println(line); }}}
catch (IOException e1) {confirmation.setText(e1.getMessage()); }
osw.flush();
osw.close();
} catch(Exception e){ confirmation.setText(e.getMessage()); }
String attach = Environment.getExternalStoragePublicDirectory(DOWNLOAD_SERVICE).getAbsolutePath() + "/output.txt"; //This is where you need to use the absolute path!!
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"MyEmail@Email.com"});
i.putExtra(Intent.EXTRA_SUBJECT, "Error Report.");
i.putExtra(Intent.EXTRA_TEXT , "Please see the attached file...");
i.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + attach)); //This is where you attach the file
try {
startActivity(Intent.createChooser(i, "Send mail..."));}
catch (android.content.ActivityNotFoundException ex) {
confirmation.setText("There is no Email Client installed on this device.");}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
そして最後に、これに使用した権限はREAD_LOGS、WRITE_EXTERNAL、READ_EXTERNALでした。
楽しんでいただければ幸いです。