android 6.0 权限程序崩溃,扫二维码崩溃与按键事件
2017-03-10 23:06
387 查看
1.权限
解决困扰我两天的问题,项目调用一些.so文件,demo,和老版本的在华为 6.0系统运行正常,但是我的项目在6.0以下的手机上运行正常,在6.0系统上程序直接崩溃,6.0系统自然想到了权限问题,但是demo没问题,问设备技术支持,直接让参考demo。并且崩溃的手机CPU是64位的,我的是32位的,最会发邮件给技术支持要arm64-v8a的文件。半天也没回,估计是没有吧。
其中加了这个也没用
后来再次遇到特殊型号设备:程序崩溃问题:原因是arm64-v8a、armeabi-v7a、armeabi 内文件数目不一样,也就是有so文件缺少对应的库,所以一定要确保每个文件夹下都有对应的文件
关于arm64-v8a、armeabi-v7a、armeabi、x86可以看这篇博文 我的Android进阶之旅——>Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
最后想还是权限的问题,直到看到了段话,我们指定targetSdkVersion为23或者之后我们还需要在运行时请求这些所需的权限。这很重要,因为已经出现了很多开发者把targetSdkVersion飙到了最新,然后发现自己的app疯狂的崩溃,这是由于他们没有实现执行运行时权限请求的代码。原文地址 最后看了看demo的targetSdkVersion确实设置的很低,最后把项目的targetSdkVersion调低了点,一切正常了。
targetSdkVersion:表示你已经在该版本上做了充分的测试,系统将为你的应用程序启动一些最新啊的功能,比如targetSdkVersion=23 系统将为你启动运行时权限这个功能,如果设置为22说明你的程序在5.1系统上进行了充分的测试,6.0的新功能自然不会启用。
versionCode 程序的版本号
软件更新时一般会用到
之前也应为so库报错在5.0上,说缺少一个库文件,但是用的那个开源库没有提供那个库,给作者联系加qq被拒,想起了那句话害死人不偿命。最后别人推荐了一个稳定的库,地址
2、本来一个功能键 Memu 弹出个菜单,但是在6.0上好像没了这个菜单,只好在右侧加个菜单键。当一些物理按钮被按下时会调用onKeyDown()方法。 网上找的一段代码修修改改。
解决困扰我两天的问题,项目调用一些.so文件,demo,和老版本的在华为 6.0系统运行正常,但是我的项目在6.0以下的手机上运行正常,在6.0系统上程序直接崩溃,6.0系统自然想到了权限问题,但是demo没问题,问设备技术支持,直接让参考demo。并且崩溃的手机CPU是64位的,我的是32位的,最会发邮件给技术支持要arm64-v8a的文件。半天也没回,估计是没有吧。
其中加了这个也没用
后来再次遇到特殊型号设备:程序崩溃问题:原因是arm64-v8a、armeabi-v7a、armeabi 内文件数目不一样,也就是有so文件缺少对应的库,所以一定要确保每个文件夹下都有对应的文件
关于arm64-v8a、armeabi-v7a、armeabi、x86可以看这篇博文 我的Android进阶之旅——>Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
最后想还是权限的问题,直到看到了段话,我们指定targetSdkVersion为23或者之后我们还需要在运行时请求这些所需的权限。这很重要,因为已经出现了很多开发者把targetSdkVersion飙到了最新,然后发现自己的app疯狂的崩溃,这是由于他们没有实现执行运行时权限请求的代码。原文地址 最后看了看demo的targetSdkVersion确实设置的很低,最后把项目的targetSdkVersion调低了点,一切正常了。
targetSdkVersion:表示你已经在该版本上做了充分的测试,系统将为你的应用程序启动一些最新啊的功能,比如targetSdkVersion=23 系统将为你启动运行时权限这个功能,如果设置为22说明你的程序在5.1系统上进行了充分的测试,6.0的新功能自然不会启用。
versionCode 程序的版本号
软件更新时一般会用到
/** * 获取版本号 * @return 当前应用的版本号 */ public int getVersion() { try { PackageManager manager = this.getPackageManager(); PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0); int version = info.versionCode; return version; } catch (Exception e) { e.printStackTrace(); return 0; } }
之前也应为so库报错在5.0上,说缺少一个库文件,但是用的那个开源库没有提供那个库,给作者联系加qq被拒,想起了那句话害死人不偿命。最后别人推荐了一个稳定的库,地址
2、本来一个功能键 Memu 弹出个菜单,但是在6.0上好像没了这个菜单,只好在右侧加个菜单键。当一些物理按钮被按下时会调用onKeyDown()方法。 网上找的一段代码修修改改。
import android.os.Bundle; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; import android.app.Activity; /** * Android常用的物理按键及其触发事件 * KEYCODE_POWER 电源键 * KEYCODE_MENU 菜单键 * KEYCODE_BACK 后退键 * KEYCODE_HOME Home键 * KEYCODE_CAMERA 相机键 * KEYCODE_SEARCH 查找键 * KEYCODE_VOLUME_UP 音量键+ * KEYCODE_VOLUME_DOWN 音量键- * KEYCODE_VOLUME_MUTE 静音 * 方向键 * KEYCODE_DPAD_CENTER * KEYCODE_DPAD_UP * KEYCODE_DPAD_DOWN * KEYCODE_DPAD_LEFT * KEYCODE_DPAD_RIGHT * 键盘键 * 数字0~9 字母A~Z * KEYCODE_0 ~ KEYCODE_9 * KEYCODE_A ~ KEYCODE_Z * 提供的回调方法有 * onKeyUp()、OnKeyDown()、onKeyLongPress() * * @author Administrator * */ public class MainActivity extends Activity { private Button btnClose = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnClose = (Button) findViewById(R.id.btnClose); btnClose.setOnClickListener(new closelistener()); } class closelistener implements OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub finish(); } } /** * 重写onKeyDown方法可以拦截系统默认的处理 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_BACK) { Toast.makeText(this, "后退键", Toast.LENGTH_SHORT).show(); return true; } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { Toast.makeText(this, "声音+", Toast.LENGTH_SHORT).show(); return false; } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { Toast.makeText(this, "声音-", Toast.LENGTH_SHORT).show(); return false; } else if (keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) { Toast.makeText(this, "静音", Toast.LENGTH_SHORT).show(); return false; } else if (keyCode == KeyEvent.KEYCODE_HOME) { Toast.makeText(this, "Home", Toast.LENGTH_SHORT).show(); return true; } return super.onKeyDown(keyCode, event); } /** * 重写onTouchEvent方法可以处理Touch事件 */ @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub if (event.getAction() == MotionEvent.ACTION_MOVE) { Toast.makeText(this, "ACTION_MOVE", Toast.LENGTH_SHORT).show(); } else if (event.getAction() == MotionEvent.ACTION_UP) { Toast.makeText(this, "ACTION_MOVE", Toast.LENGTH_SHORT).show(); } else if (event.getAction() == MotionEvent.ACTION_DOWN) { Toast.makeText(this, "ACTION_MOVE", Toast.LENGTH_SHORT).show(); } return super.onTouchEvent(event); } }
动态权限申请
private String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION}; f (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 检查该权限是否已经获取 int i = ContextCompat.checkSelfPermission(this, permissions[0]); // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝 if (i != PackageManager.PERMISSION_GRANTED) { // 如果没有授予该权限,就去提示用户请求 startRequestPermission(); }else{ //正常操作 } } // 开始提交请求权限 private void startRequestPermission() { ActivityCompat.requestPermissions(this, permissions, 321); } // 用户权限 申请 的回调方法 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 321) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { //获取失败 } else { Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show(); //进行正常操作 } } } }
相关文章推荐
- 当用户手动取消相机权限导致的程序崩溃的解决办法(Android 6.0以上好像没事,好像是...)
- 【已解决】Android 6.0权限设置,导致程序崩溃
- Android 6.0 运行中手动去设置界面取消该app的某个权限,导致application被强制销毁造成app崩溃问题的解决
- Android程序报错:Anroid 6.0 权限问题java.io.FileNotFoundException: ……:open failed: EACCES (Permission denied)
- Android 6.0 运行时权限处理 二维码开发
- 摄像头权限被拒绝导致程序崩溃的问题(6.0以下版本)
- Android 6.0 运行时权限处理 二维码开发
- [Android 6.0] 程序开发(一)--运行时请求权限
- Android检查应用权限是否被禁用,解决权限被禁用时程序崩溃
- Android 6.0 ROOT 后部分程序无法检测 ROOT 权限问题
- android拨打电话崩溃6.0以上实时动态权限申请
- android 6.0 权限崩溃分析:android.system.ErrnoException: statvfs failed: ENOENT (No such file or directory)
- Android 6.0动态权限适配
- Android中捕捉menu按键点击事件的方法
- android 6.0权限--代码
- Android程序运行时权限与文件系统权限的区别
- Android 6.0运行时权限
- android 6.0 权限授权
- Android权限管理之Android 6.0运行时权限及解决办法
- Android 按键事件小结