您的位置:首页 > 移动开发 > Android开发

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 程序的版本号

软件更新时一般会用到

/**
* 获取版本号
* @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();
//进行正常操作
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: