android抓取log发送到服务器

本文详细介绍了在Android环境中如何正确配置应用权限,以便能够有效地使用Logcat功能抓取和保存日志信息。通过修改AndroidManifest.xml文件,添加必要的权限声明,并在代码中实现logcat日志的抓取与保存,确保应用能够在设备上读取并保存日志到SD卡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司需要这个功能,记录之

参考资料:

https://stackoverflow.com/questions/55903933/how-can-i-set-permission-on-rk3288-with-android-7-1

http://www.trinea.cn/android/android-java-execute-shell-commands/

步骤

  1. android抓取log.txt(记为A)
  2. A保存到本地
  3. A发送到服务器

之前搞错了,程序运行adb shell会报权限错误:java.io.IOException: Cannot run program "adb": error=13, Permission denied

并不会写入内存或sd卡,查了相关资料改正如下:

AndroidManifest.xml

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

获取logcat代码

textView=(TextView)findViewById(R.id.tvShow);
        textView.setMovementMethod(ScrollingMovementMethod.getInstance());  //設置滾動條
         if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){   //判断是否android6.0以上
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
            }   //获取相应权限
                sdcardPath=Environment.getExternalStorageDirectory().getAbsolutePath();//获取相对路径
                Log.i("wp sdcardpath---------->",sdcardPath);
                try {
                    Log.i("wp start","wp start");
                    Process p = Runtime.getRuntime().exec("logcat -d"); //直接调用logcat命令不用adb
                    BufferedReader bufferedReader = new BufferedReader( //读取logcat信息
                            new InputStreamReader(p.getInputStream()));
                    StringBuilder log=new StringBuilder();
                    String line = "";
                    while ((line = bufferedReader.readLine()) != null) {
                        log.append(line+"\n");
                    }
                    textView.setText(log.toString());
                    saveFile(log.toString(),"log1503"); //保存到sd卡
                    Log.i("wp log---------->",log.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.i("wp error",e.toString());
                }
            }

保存logcat方法

 public  void saveFile(String stringcontnt,String filename){
        try{
            FileOutputStream outputStream=new FileOutputStream("/sdcard/"+filename+".txt",true);
            OutputStreamWriter outputStreamWriter=new OutputStreamWriter(outputStream,"UTF-8");
            outputStreamWriter.write(stringcontnt);
            outputStreamWriter.write("/n");
            outputStreamWriter.flush();
            outputStreamWriter.close();
        }
        catch (Exception e){
            Log.i("wp putError------->",e.toString());
        }
    }

完整代码:

package com.example.evan.evanuploadtxt;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

import static com.example.evan.evanuploadtxt.ShellUtils.execCommand;

public class MainActivity extends AppCompatActivity {
private TextView textView;
private String sdcardPath;
//读写权限
    private  static String[]PERMISSIONS_STORAGE={
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS
};
    //请求状态码
    private static int REQUEST_PERMISSION_CODE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView=(TextView)findViewById(R.id.tvShow);
        textView.setMovementMethod(ScrollingMovementMethod.getInstance());  //設置滾動條
         if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){   //判断是否android6.0以上
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
            }   //获取相应权限
                sdcardPath=Environment.getExternalStorageDirectory().getAbsolutePath();//获取相对路径
                Log.i("wp sdcardpath---------->",sdcardPath);
                try {
                    Log.i("wp start","wp start");
                    Process p = Runtime.getRuntime().exec("logcat -d"); //直接调用logcat命令不用adb
                    BufferedReader bufferedReader = new BufferedReader( //读取logcat信息
                            new InputStreamReader(p.getInputStream()));
                    StringBuilder log=new StringBuilder();
                    String line = "";
                    while ((line = bufferedReader.readLine()) != null) {
                        log.append(line+"\n");
                    }
                    textView.setText(log.toString());
                    saveFile(log.toString(),"log1503"); //保存到sd卡
                    Log.i("wp log---------->",log.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.i("wp error",e.toString());
                }
            }
        }

    /**
     * 保存文件到sd卡
     * @param stringcontnt  保存的内容
     * @param filename  文件名
     */
    public  void saveFile(String stringcontnt,String filename){
        try{
            FileOutputStream outputStream=new FileOutputStream("/sdcard/"+filename+".txt",true);
            OutputStreamWriter outputStreamWriter=new OutputStreamWriter(outputStream,"UTF-8");
            outputStreamWriter.write(stringcontnt);
            outputStreamWriter.write("/n");
            outputStreamWriter.flush();
            outputStreamWriter.close();
        }
        catch (Exception e){
            Log.i("wp putError------->",e.toString());
        }
    }
}

 

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值