繁体   English   中英

BroadcastReceiver的onReceive()方法永远不会被调用

[英]method onReceive() of BroadcastReceiver never gets called

我有一个应用程序,我试图在其中注册一个侦听此类型的意图的BroadcastReceiverandroid.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM