0

私はまだAndroid開発に非常に慣れていないので、私の質問がばかげているように思われる場合は、事前に謝罪します。

私のアプリケーションにはボタンが1つあります。ボタンをクリックすると、アプリケーションが内部ストレージに独自のフォルダーを持っているかどうかを確認しようとします。ない場合は、フォルダーを作成し、output.txtというファイルを作成してから、システム情報をoutput.txtに書き込みます。 「SIP_MESSAGE」を含むすべての行をlogcatからoutput.txtに書き込もうとし、デフォルトの電子メールアドレスに電子メールを送信します。


編集

数日間の苦労の後、私はなんとかそれをすべてまとめることができました。詳細については、以下の回答をお読みください。

4

4 に答える 4

1

数日間の調査と数え切れないほどの推測とチェックの後、私はついにすべてを理解しました。誰かがこれに遭遇して、私が持っていたのと同じ問題を抱えている場合に備えて、私は実際にすべてを説明するためにこの時間を取りたいと思います。うまくいけば、あなたが探しているものがすべてここにあり、あなた(そして私)がこれまでに訪れた他の何百ものサイトよりも良い説明をしました。

最初のトピックは、内部ストレージと外部ストレージの違いです(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でした。

楽しんでいただければ幸いです。

于 2013-01-24T23:01:32.730 に答える
0

おっと!あまりにも早く話しました、あなたは内部を意味しました。

フォルダを作成するのではなく、アプリのディレクトリに直接ファイルを書き込んでみませんか。それが最初に機能するかどうかを確認します。

そのためにあなたはするかもしれません:

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();

これはあなたが探しているものです:

File outputDir = new File(Environment.getExternalStorageDirectory()
            + "/farmer survey");
    outputDir.mkdirs();
    File outputFile = new File(outputDir, "something.csv");
    try {

        FileOutputStream fos = new FileOutputStream(outputFile);
        PrintWriter pw = new PrintWriter(fos);

        pw.println(text);
        pw.close();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

また、次の権限を追加する必要があります。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
于 2013-01-23T01:18:24.943 に答える
0

マニフェストにandroid.permission.READ_LOGS権限がありますか?

于 2013-01-23T02:25:58.843 に答える
0

メール部分については、自動的に送信するつもりですか?

そうだとすれば、バックグラウンドで簡単にできるとは思いません。最良の方法は、output.txtを添付ファイルとして添付してGmailアプリを呼び出すことです。その後、手動で送信する必要があります。

そうしないと、コーディングが非常に長くなる可能性があります。ここを参照してください。

デフォルト/組み込みアプリを使用せずにJavaMailAPIを使用してAndroidでメールを送信する

または、SMSを介して送信する別の方法もあります。これは、バックグラウンドで実行できます。

于 2013-01-23T02:57:13.103 に答える