現在、数人の友人とアプリケーションをテストしています。例外をスローしないエラーが時々あります。だから、何が問題だったのかよくわかりません。そこで、ログを調べることができるように、logcat の出力を電子メール アドレスに送信できるメニュー項目を実装することをお勧めします。
残念ながら、電話から logcat を抽出する方法に関するヒントはインターネットで見つかりませんでした。メールの送信方法は問題になりません。
android-log-collectorを見てください。あなたがやろうとしていることを実行します。
Android 4.1 以降、任意の LogCat データを収集することはできません。それを行うための文書化されサポートされている方法は決してなく、文書化されていない/サポートされていない方法は Jelly Bean でロックされていました。独自のクラッシュについては、 ACRAなどのクラッシュ ログ ライブラリを使用することをお勧めします。
また、一般的な分析を提供するだけでなく、任意の情報をログに記録したり、キャッチされなかった例外をログに記録したりできるFlurry(flurry.com )についても調べます。私は文字通り5分で設定しましたが、覚えておくべきことの1つは、電子メールアラートのようにリアルタイムではないということです。アプリにログインした内容がダッシュボードに表示されるまで、数時間待つ必要があります。本当に軽量なアプリを使用している場合もやり過ぎかもしれませんが、サービスを使用した結果としてアプリのパフォーマンスが低下することはありません。
LogCollectorは確かに非常に便利であることがわかりました(CommonsWareからのヒント):
そして、あなた自身のアプリケーションで設定することを忘れないでください:
<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);
以下の行に書き込みます: これにより、アプリの logcat がデバイスの外部ストレージに書き込まれます。
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 ファイルでは、投稿メッセージがサーバーに到達したときに何を行うかを定義できます。データをメールアドレスに転送する非常に単純なコードを定義しました。
これは、キャッチされていない例外がスローされた場合にのみ機能します。しかし、デフォルトのキャッチされていない例外ハンドラーを拡張して、スタックトレースだけでなく logcat も取得できるようにすることもできます。