最近半路接手一个项目,这项目从最开始设计的时候是没有兼容到6.0这个版本趋势.
一些普通功能还好,随着项目内功能越来越多,需求也越来越多,所以导致很多问题,
最近在一个技术交流群中,也有很多人问了类似的问题,所以特别来这里总结一波,
也希望遇到相同问题的人再看到这篇文章之后能快速解决问题.
首先来描写基于安卓6.0不做处理的话,可能会出现一些什么问题:
1.百度地图使用闪退
2.shareSDK闪退
3.有自定义相册功能的时候
现象就是白一下回到前一个界面
等等一些问题,特别是三方sdk,出问题的几率非常非常大. 当然,有的6.0机型
确不会出现这些问题,或者是很偶然出现这些问题,但是就我自己经验来说,华为 p7
p8这两款6.0以上系统时,简直问题出现报的不要不要的.可能是因为华为的系统自
己改过得原因吧,都知道华为系统改的坑死,个人感觉比魅族还坑~~~~好吧不吐槽
了,下面上干货.
为什么会出现这些问题呢?首先我们要探讨下安卓权限机制,众所周知,安卓权限
机制一直被人诟病,所以6.0痛改前非,加入了动态获取权限的机制,也就是说,你在清单
文件中注册的权限,在跑程序的时候不一定是给与的,所以就会出现什么问题?对就是
缺少权限的问题.特别是三方skd往往需要一大堆的权限,所以出错的几率特别高.然后
就会怎么样了?
你就会被测试妹子追着说:"哥哥,哥哥,这里有问题!"
哈哈卖个萌~~~
开始的时候我也是糊涂了,一般来说在定义产品的时候如果兼容到6.0就应该做处
理的,可是半路接手的项目我就不多说了,谁叫我负责呢T T开始的时候还挺莫名的没往
这个方面想,确实坑了1个多小时,现在终于把这个坑给填上了. 现在说方法:方法就是基
于6.0动态获取权限.现在网上也有不少这方面的代码了,但是就我个人而言特别不喜欢
那种藏一半的代码了,我贴的代码都是自己确实能运用的有注释小伙伴们可以直接拿过
去用,事先说明注释不详细不关我事啊哈哈~~~~~下面是demo代码(非原创不过道理
一样,我自己标的注释)
public class MainActivity extends AppCompatActivity
{
//回调值
private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void testCall(View view)
{
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CALL_PHONE)
!= PackageManager.PERMISSION_GRANTED)
{//没权限
//动态获取权限6.0才有效果
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CALL_PHONE},
MY_PERMISSIONS_REQUEST_CALL_PHONE);
} else//有权限
{
callPhone();
}
}
public void callPhone()
{
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "10086");
intent.setData(data);
startActivity(intent);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
{
if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE)//判断返回值
{
if (grantResults[0] == PackageManager.PERMISSION_GRANTED)//判断是否动态获取权限了
{
callPhone();
} else
{//没有动态获取权限提示用户没权限,无法使用这个功能
// Permission Denied
Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}