アプリのログキャット出力を電子メールアドレスに送信します

StackOverflow https://stackoverflow.com/questions/2852181

  •  27-09-2019
  •  | 
  •  

質問

現在、数人の友人と一緒にアプリケーションをテストしています。例外を投げかけないエラーがいくつかある場合があります。だから私は問題が何であるか本当にわかりません。そのため、ログを調べることができるように、ログキャット出力を電子メールアドレスに送信できるメニュー項目を実装することをお勧めします。

残念ながら、電話からログキャットを抽出する方法をインターネットでヒントを見つけませんでした。メールを送信する方法は問題ではありません。

役に立ちましたか?

解決

見る Android-Log-Collector, 、それがあなたがやろうとしていることをするように。

Android 4.1の任意のLogCatデータを収集することはできません。それを行うための文書化されサポートされた方法はありませんでした、そして文書化されていない/サポートされていない方法はありませんでした ゼリービーンに閉じ込められました. 。あなた自身のクラッシュのために、あなたはクラッシュロギングライブラリを使用して提供する方が良いです。 Acra.

他のヒント

私も突風を調べます(flurry.com)これにより、一般的な分析が提供されるだけでなく、任意の情報を記録することができ、また、猛攻撃の例外を記録できます。文字通り5分で設定しますが、留意すべきことの1つは、電子メールアラートのようにリアルタイムではないということです。アプリにログインするものがダッシュボードに表示されるまで、数時間待つ必要があります。本当に軽量なアプリをお持ちの場合は、やり過ぎになる可能性もありますが、サービスを使用した結果、アプリにパフォーマンスの損失がないことに気付きました。

私はそれを見つけました logcollector 確かに非常に便利です(コモンズウェアからのヒント):

そして、あなた自身のアプリケーションを設定することを忘れないでください:

<uses-permission android:name="android.permission.READ_LOGS" />

このプロジェクトも見ることをお勧めします ここ

このソリューションは電子メールを送信しませんが、UDPを介してサーバーに送信します。

https://github.com/chemik/logcatudp

ソースコードが利用可能です。それは私たち自身のアプリに簡単に埋め込むことができます。私はそうしようとしていません。

マニフェストファイルで次のアクセス許可を与えます。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

最初の/ランチャーアクティビティで、直後

super.onCreate(savedInstanceState);

以下に書く:これにより、アプリのログキャットをデバイスの外部ストレージに書き込みます

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_PERMISSION_CODE);
    }
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_PERMISSION_CODE);
    }

    if ( isExternalStorageWritable() ) {

        File appDirectory = new File( Environment.getExternalStorageDirectory() + "/MyAppLog" );
        File logDirectory = new File( appDirectory + "/log" );
        File logFile = new File( logDirectory, "logcat" + ".txt" );

        // create app folder
        if ( !appDirectory.exists() ) {
            appDirectory.mkdir();
        }

        // create log folder
        if ( !logDirectory.exists() ) {
            logDirectory.mkdir();
        }

        // clear the previous logcat and then write the new one to the file
        if ( logFile.exists()){
            logFile.delete();
        }

        try {
            Process process = Runtime.getRuntime().exec("logcat -c");
            process = Runtime.getRuntime().exec("logcat -f " + logFile);
        } catch ( IOException e ) {
            e.printStackTrace();
        }

    } else if ( isExternalStorageReadable() ) {
        // only readable
    } else {
        // not accessible
    }

logcatを目的のメールアドレスに送信するには:以下の方法を使用します

public void sendLogcatMail(){

    if ( isExternalStorageWritable() ) {

        File appDirectory = new File(Environment.getExternalStorageDirectory() + "/MyAppLog");
        File logDirectory = new File(appDirectory + "/log");
        File logFile = new File(logDirectory, "logcat" + ".txt");

        if (logFile.exists()) {
            Intent emailIntent = new Intent(Intent.ACTION_SEND);
            emailIntent.setType("vnd.android.cursor.dir/email");
            String to[] = {"yourEmailAddress@gmail.com"};
            emailIntent.putExtra(Intent.EXTRA_EMAIL, to);
            emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(String.valueOf(logFile.toURI())));
            emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Log files");
            emailIntent.putExtra(Intent.EXTRA_TEXT, "Send some message along");
            startActivity(Intent.createChooser(emailIntent, "Send email..."));
        }
    }
}

外部ストレージへの書き込み許可が与えられているかどうかを確認する方法:

/ *読み取りと書き込みに外部ストレージが利用可能であるかどうかを確認 */

public static boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if ( Environment.MEDIA_MOUNTED.equals( state ) ) {
        return true;
    }
    return false;
}

あなたに感謝します2ですが、Android-Log-Collectorフォーラムを閲覧することで私は見つけました 解決 それはさらに扱いやすいです:

そこで、サーバーのどこかにPHPファイルを保存できます(または、自分のサーバーを使用したくない場合は、サーバーにスクリプトもあります)。このPHPファイルでは、投稿メッセージがサーバーに到達したときに何が行われるかを定義できます。データをメールアドレスに転送する非常に単純なコードを定義しました。

これは、猛攻撃の例外がスローされた場合にのみ機能します。ただし、デフォルトの不自由な例外ハンドラーを拡張できるため、StacktraceだけでなくLogCatも取得することも可能です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top