[英]method onReceive() of BroadcastReceiver never gets called
我有一个应用程序,我试图在其中注册一个侦听此类型的意图的BroadcastReceiver
: android.intent.action.CAMERA_BUTTON
但问题是我的onReceive()方法永远不会被调用!
这就是我做的:
在onCreate()
我也尝试在onResume()
进行注册,但结果相同:
drb=new Adisor();
IntentFilter intent=new IntentFilter("android.intent.action.CAMERA_BUTTON");
registerReceiver(drb,intent);
还有我的班级Adisor
:
public class Adisor extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("Bau");
if (intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT) != null) {
// prevent the camera app from opening
abortBroadcast();
System.out.println("HEY");
// mCamera.takePicture(null, mPictureCallback, mPictureCallback);
}
}
}
而且我在manifest file
具有以下权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera" />
但是当我按下相机按钮时,logcat中不会显示任何消息!为什么?
编辑:我也尝试在清单文件中注册我的意图
<activity android:name=".TakePhoto"
>
<receiver android:name="com.Contest.Adisor"
android:enabled="true" android:exported="true">
<intent-filter android:priority="10000">
<action android:name="android.intent.action.CAMERA_BUTTON" />
</intent-filter>
</receiver>
Adisor is an inner class of `TakePhoto`.
您是按硬件相机按钮还是软件按钮? 仅在按下硬件摄像头按钮时才调用它,而在摄像头应用程序中不使用该按钮。
编辑
另外,刚刚发现了这个问题: android.intent.action.CAMERA_BUTTON不在Desire Z(Froyo)上播放吗?
根据我对兼容性定义文档的阅读,不需要设备制造商在单击“摄像机”按钮时发送任何广播。 它可能仅由Desire Z上的前台活动使用。我没有Z,因此无法确认您的测试。
由于绝大多数Android设备根本没有CAMERA按钮,因此您需要确保您的应用在没有此类按钮的情况下仍能正常工作,并且您建议用户CAMERA按钮可能会或可能不会与您的应用一起使用,具体取决于设备。
试试这样吧。
IntentFilter intentFilter =
new IntentFilter(Intent.ACTION_CAMERA_BUTTON);
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
registerReceiver(drb, intentFilter);
替换下面的代码部分。
public class Adisor extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("Bau");
if (intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT) != null) {
// prevent the camera app from opening
abortBroadcast();
System.out.println("HEY");
// mCamera.takePicture(null, mPictureCallback, mPictureCallback);
}
}
}
有了这个。
private final BroadcastReceiver drb = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("Bau");
if (intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT) != null) {
// prevent the camera app from opening
abortBroadcast();
System.out.println("HEY");
// mCamera.takePicture(null, mPictureCallback, mPictureCallback);
}
}
};
您必须在清单中进行以下更改
<activity android:name=".TakePhoto">
<receiver android:name="com.Contest.TakePhoto$Adisor"
android:enabled="true" android:exported="true">
<intent-filter android:priority="10000">
<action android:name="android.intent.action.CAMERA_BUTTON" />
</intent-filter>
</receiver>
因为您在活动TakePhoto中声明了广播接收器
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.