玖叶教程网

前端编程开发入门

Android Studio 真机调试捕获异常申请和蓝牙权限代码

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,里面显示的就是异常的内容

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言