android 6.0 权限程序崩溃,扫二维码崩溃与按键事件

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();
                    //进行正常操作
                }
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值