Android Studio 真机调试捕获异常申请和蓝牙权限代码
第一步:
在Android的manifest.xml文档中加入下面的声明:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="true" />
第二步:在onCreate()方法加入如下两行:
checkAndRequestPermission();//第一步:targetSdk>23检查并请求权限
catchMyExp();//捕获异常并保存到手机SD卡根目录,文件名为AException.txt
第三步:在加入如下几个方法:
public void saveToSDCard(String fileName, String content)
throws IOException {
// 考虑不同版本的sdCard目录不同,采用系统提供的API获取SD卡的目录
File file = new File(Environment.getExternalStorageDirectory(),
fileName);
if (!file.isDirectory()) {
file.createNewFile();
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(content.getBytes());
fileOutputStream.close();
}
public void catchMyExp()
{
// 捕获应用的运行时异常
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
// 给主线程设置一个处理运行时异常的handler
@Override
public void uncaughtException(Thread thread, final Throwable ex) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
StringBuilder sb = new StringBuilder();
sb.append("Version code is ");
sb.append(Build.VERSION.SDK_INT + "\n");
// 设备的Android版本号
sb.append("Model is ");
sb.append(Build.MODEL + "\n");
// 设备型号
sb.append(sw.toString());
try {
saveToSDCard("AException.txt", sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
});
}
/**
*
* ----------第二步骤:包含3个方法,非常重要----------
*
* Android6.0以上的权限适配简单示例:
*
* 如果targetSDKVersion >= 23,那么必须要申请到所需要的权限。
*
* 注意:下面的`checkSelfPermission`和`requestPermissions`方法都是在Android6.0的SDK中增加的API,如果您的App还没有适配到Android6.0以上,则不需要调用这些方法
*/
@TargetApi(Build.VERSION_CODES.M)
private void checkAndRequestPermission() {
List<String> lackedPermission = new ArrayList<String>();
if (!(checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
lackedPermission.add(Manifest.permission.ACCESS_COARSE_LOCATION);
}
if (!(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) {
lackedPermission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
// 权限都已经有了,那么直接调用SDK
if (lackedPermission.size() == 0) {
//权限都申请到了,此处写其他要继续执行的代码。
} else {
// 请求所缺少的权限,在onRequestPermissionsResult中再看是否获得权限,如果获得权限就可以调用SDK,否则不要调用SDK。
String[] requestPermissions = new String[lackedPermission.size()];
lackedPermission.toArray(requestPermissions);
requestPermissions(requestPermissions, 1024);
}
}
private boolean hasAllPermissionsGranted(int[] grantResults) {
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
return false;
}
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1024 && hasAllPermissionsGranted(grantResults)) {
//权限都申请到了,此处写其他要继续执行的代码。
} else {
// 如果用户没有授权,那么应该说明意图,引导用户去设置里面授权。
Toast.makeText(this, "Permission Hint", Toast.LENGTH_LONG).show();
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
finish();
}
}//onRequestPermissionsResult End
就可以在手机的SD卡根目录查找AException.txt,里面显示的就是异常的内容