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

Android开发中一些疑难异常解决

2016-01-22 11:49 453 查看
Android开发中总是会遇到一些奇奇怪怪的问题,有时真不知如何下手。点滴经验,重在积累。分享我在实际开发中遇到的一些问题,以后还会继续添加或者有单独篇幅进行分析。

java.lang.SecurityException: Not allowed to bind to service Intent解决

Android开发过程中,有时候需要在应用中创建远程服务,以供其他应用调用,比如蓝牙服务,WIFI服务等等。那么,在开发过程中,会遇到java.lang.SecurityException: Not allowed to bind to service Intent绑定服务失败的问题,依次按照下面的过程即可解决:

1、manifest文件中的service声明加属性:android:process=”:remote”

android:exported=”true”,并且要添加的action。

<service android:name=”com.idengpan.exserv.RemoteService” android:process=”:remote”
android:exported=”true” android:permission=”android.permission.INTERNET”>
<intent-filter >
<action android:name=”com.idengpan.exserv.RemoteService” android:exported=”true” />
</intent-filter>
</service>


2、第一种方式不凑效,尝试卸载2个应用,重新安装再启动服务试试。因为可能有服务正在运行的情况。

3、以上2种均不凑效,就要看远程服务的配置里是否配置了 android:permission=“xxxx”的权限,那么在调用服务的应用中要申明这样的权限才可以调用,否则也会绑定失败。

以上是本人在demo中遇到的问题并行之有效的方法,不保证能囊括所有的情况。

Exported service does not require permission配置问题

在Android开发过程中,service是比较常用的组件。作为四大组件之一,service需要在manifest文件中进行申明注册。和activity方式一样,类似的格式。

但在申明的过程中,总是会遇到一些很奇怪的警告,尽管这些警告对程序运行没什么影响,但如果可以的话我们还是希望将警告消灭掉。Exported service does not require permission就是其中一个错误。其申明的格式为:

<service android:name=”com.idengpan.exserv.MyService”>
<intent-filter >
<action android:name=”com.idengpan.exserv.MyService”/>
</intent-filter>
</service>


简单的service声明以及action注册。

第一种解决方案是根据警告解决添加一个permission既可。如下

<service android:name=”com.idengpan.exserv.MyService” android:permission=”android.permission.INTERNET”>
<intent-filter >
<action android:name=”com.idengpan.exserv.MyService”  />
</intent-filter>
</service>


第二种解决方案是加入exported=”false”即可,exported属性指该服务是否能够被其他应用程序组件调用或跟它交互,注意是在service节点以及action节点都添加。如下:

<service android:name=”com.idengpan.exserv.MyService”
android:exported=”false”>
<intent-filter >
<action android:name=”com.idengpan.exserv.MyService” android:exported=”false” />
</intent-filter>
</service>


这样警告即可消除了。

Android Dialog requestFeature() must be called before adding content

Exception: requestFeature() must be called before adding content的错误,根据错误原因,知道通过window什么的来设置自定义的效果之前,需要加入一些内容View。所以,我们在调用setContentView方法前,就需要完成所有的动作。一般的解决方案是在dialog.show()后调用dialog.setContentView方法,这样就可以好好的解决了!

相机连拍Camera.open返回空如何解决

最近开发android应用用到相机,因为要连拍,需要自定义相机,然后一整套的代码都需要写了。但写到开始的打开相机以及设置其属性时,连拍模式下的打开相机服务总是会报异常并将app退出。Camera.open();这一句,很蛋疼。不管怎么在surfaceDestroyed()方法和onDestroy()方法中执行Camera对象的释放

if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}


都无法解决。后来才找到这种释放代码要放到onPause中才行……真心蛋疼。但总算是解决问题了。

library工程No resource identifier found for attribute

自定义了View,也定义了对应的declare-styleable属性值,但是在编译运行时,主工程会报错No resource identifier found for attribute “XXX”这种恼人的问题。

这种问题的原因是:在定义自定义View的布局文件里,名称空间要写主工程的包名,而不能写library工程(也就是被引用工程的包名)。那么问题来了,如果这样,library就失去了意义,因为你被某一个app(包名)定义了,不能再扩展。最终的解决方案是:xmlns:yf=”http://schemas.android.com/apk/res/com.yuanfang.xxx”改成

xmlns:yf=”http://schemas.android.com/apk/res-auto”。完美解决!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: