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

时间:2011-08-25 07:34:19

标签: android broadcastreceiver

我有一个应用,其中我正在尝试注册一个监听此类意图的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`.

3 个答案:

答案 0 :(得分:1)

您是按下硬件相机按钮还是软件按钮?只有在按下硬件摄像头按钮时才会调用它,而不是使用摄像头应用程序中的按钮。

修改
另外,刚刚发现了这个: android.intent.action.CAMERA_BUTTON not broadcasting on Desire Z (Froyo)?

  

设备制造商无需发送任何内容   单击CAMERA按钮时广播,从我的阅读中读取   兼容性定义文档。它可能只被用于   Desire Z上的前景活动。我没有Z,所以不能   确认你的测试。

     

由于绝大多数Android设备都没有CAMERA按钮   根本不需要,你需要确保你的应用程序运行良好   一个按钮,您建议用户可以使用CAMERA按钮   根据设备不适用于您的应用。

答案 1 :(得分:1)

试试这样。

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);
                           }
                       }
};

答案 2 :(得分:1)

您必须更改清单中的以下更改

<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中声明了广播接收器