9

通知から放送受信機をトリガーしたい。通知にあるボタンをクリックすると、次のエラーが表示されます。

「レシーバーcom.example.testservice.myBroadをインスタンス化できません:java.lang.ClassCastException:com.example.testservice.myBroadをandroid.content.BroadcastReceiverにキャストできません」

**更新/編集され、現在機能しています**

  1. 通知から放送受信機までの2つのボタンの処理を手伝ってもらえますか?再生ボタンが押されたか一時停止したかを通知ブロードキャストトリガーからレシーバーに追加の値を渡すにはどうすればよいですか?

  2. これでボタンは機能しますが、通知テキストをクリックしてもアクティビティに参加できません。何か助けはありますか?

このコードは、2つのボタンに追加の意図を持って記述しています。

 RemoteViews layout = new RemoteViews(getPackageName(), R.layout.notification);
            layout.setTextViewText(R.id.notification_title, getString(R.string.app_name));
            Intent clickIntent = new Intent();
            clickIntent.putExtra("button","pause");
            clickIntent.setAction(ACTION_DIALOG);
           
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), pendingRequestCode, clickIntent, pendingFlag);
            layout.setOnClickPendingIntent(R.id.notification_button,pendingIntent);
            builder.setContent(layout);
            
            
             layout = new RemoteViews(getPackageName(), R.layout.notification);
            layout.setTextViewText(R.id.notification_title, getString(R.string.app_name));
            Intent click = new Intent();
            clickIntent.putExtra("Button","play");
            clickIntent.setAction(ACTION_DIALOG);
           
            PendingIntent pi1 = PendingIntent.getBroadcast(getApplicationContext(), pendingRequestCode, click, pendingFlag);
            layout.setOnClickPendingIntent(R.id.notification_button1,pi1);
            builder.setContent(layout);

myBroadレシーバーファイル

Bundle extrasBundle = intent.getExtras();
    String str = (String) extrasBundle.get("button");       
    Toast.makeText(context, str, Toast.LENGTH_SHORT).show();

    context.stopService(new Intent(context, myPlayService.class));

これが私のコードです:

void showNotification() {
     int pendingRequestCode = 0;
        int pendingFlag = 0;

        final Resources res = getResources();
        final NotificationManager notificationManager = (NotificationManager) getSystemService(
                NOTIFICATION_SERVICE);
        Intent intent = new Intent(MainActivity.this,myBroad.class);
        PendingIntent pi= PendingIntent.getActivity(this, 0, intent, 0);
        Notification.Builder builder = new Notification.Builder(this)
                .setSmallIcon(R.drawable.ic_action_search)
                .setAutoCancel(true)
                .setTicker("this is notification")
                .setContentIntent(getDialogPendingIntent("Tapped the notification entry."));

        
            // Sets a custom content view for the notification, including an image button.
            RemoteViews layout = new RemoteViews(getPackageName(), R.layout.notification);
            layout.setTextViewText(R.id.notification_title, getString(R.string.app_name));
            Intent clickIntent = new Intent();
            clickIntent.setAction(ACTION_DIALOG);
           
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), pendingRequestCode, clickIntent, pendingFlag);
            layout.setOnClickPendingIntent(R.id.notification_button,pendingIntent);
            builder.setContent(layout);

            // Notifications in Android 3.0 now have a standard mechanism for displaying large
            // bitmaps such as contact avatars. Here, we load an example image and resize it to the
            // appropriate size for large bitmaps in notifications.
            Bitmap largeIconTemp = BitmapFactory.decodeResource(res,
                    R.drawable.notification_default_largeicon);
            Bitmap largeIcon = Bitmap.createScaledBitmap(
                    largeIconTemp,
                    res.getDimensionPixelSize(android.R.dimen.notification_large_icon_width),
                    res.getDimensionPixelSize(android.R.dimen.notification_large_icon_height),
                    false);
            largeIconTemp.recycle();

            builder.setLargeIcon(largeIcon);

        notificationManager.notify(NOTIFICATION_DEFAULT, builder.getNotification());
 }
    

    PendingIntent getDialogPendingIntent(String dialogText) {
        return PendingIntent.getActivity(
                this,
                dialogText.hashCode(), // Otherwise previous PendingIntents with the same
                                       // requestCode may be overwritten.
                new Intent(ACTION_DIALOG)
                        .putExtra(Intent.EXTRA_TEXT, dialogText)
                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK),
                0);
    }
 

myBroad.class

public class myBroad extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Toast.makeText(context, "received", Toast.LENGTH_SHORT).show();
    
        context.stopService(new Intent(context, myPlayService.class));  
    }
}

マニフェストファイルは次のとおりです。

 <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
           

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
          </activity>
          
     <receiver android:name=".myBroad">
        <intent-filter >
<action android:name="android.intent.action.MEDIA_BUTTON"/>
    </intent-filter>

        </receiver>
  
    <service android:name="com.example.testservice.myPlayService" android:icon="@drawable/ic_action_search" android:label="@string/app_name" android:enabled="true"/>
    
    
</application>
4

3 に答える 3

3

myBroadはアクティビティオブジェクトであり、ブロードキャストオブジェクトではないため...

アクティビティから(継承)を拡張し、broadcastreceiverを拡張する内部クラスを作成する代わりに、broadcastreceiverから直接継承します。

于 2012-09-11T15:03:01.823 に答える
1

メソッドでは、の代わりにgetDialogPendingIntent使用する必要があります。これにより、ブロードキャストがプッシュされます。PendingIntent.getBroadcastPendingIntent.getActivityPendingIntent

そしてこれを修正します:

public class myBroad extends BroadcastReceiver

于 2012-09-11T15:04:37.217 に答える
0

例外はそれを明確に示しています-現在のようではなく、myBroad拡張する必要があります。BroadcastReceiverActivity

PS: 適切な命名規則に切り替えることを検討する必要があります。MyBroadしたがって、 (クラス)である必要がありますが、 myBroad(そのクラスのオブジェクト)です。すなわち:

MyBroad myBroad = new MyBroad();
于 2012-09-11T15:03:57.090 に答える