2

アプリで使用MediaPlayerしています。Ongoing Notificationユーザーがこれらのコントロールにアクセスするためにアプリに移動する必要がないように、アプリにメディア プレーヤー コントロール (前、次、停止ボタンなど) を追加しています。プラットフォーム4.x では問題ないように見えます。Android 4.2.2 での通知のスクリーンショットを次に示します。

Android 4.2.2 に関するお知らせ

しかし、Android 2.2 では、次のようになります。

Android 2.2 に関するお知らせ

私のコードは次のとおりです。

private Notification generateNotification() {
    Log.d(TAG, "generateNotification called");

    Intent actionIntent = new Intent(getApplicationContext(),
            AartiActivity.class);
    PendingIntent pi = PendingIntent.getActivity(getApplicationContext(),
            0, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    RemoteViews mNotificationView = new RemoteViews(getPackageName(),
            R.layout.notification_view);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(
            getApplicationContext());
    builder.setSmallIcon(R.drawable.icon);
    builder.setContent(mNotificationView);
    builder.setOngoing(true);
    builder.setTicker("Aarti Sangrah");
    builder.setContentIntent(pi);
    mNotificationView.setImageViewResource(R.id.imgAppIc, R.drawable.icon);
    mNotificationView.setTextViewText(R.id.txtAartiPlaying, mediaName);

    return builder.build();
}// generateNotification

そして、startForeground(1, generateNotification());onPrepared ()を呼び出しました。

リモート ビューはAPI レベル 1 以降で利用できます。また、これも十分にサポートされています。どこかで読んだことがありますが、Honeycomb より前はサポートされていませんでした。ただし、Android 2.x を搭載したいくつかのデバイスでは、この機能を利用できます。また、これを確認するためにAndroid 2.2のMusic Playerのソースコードをこちらから見ました。

これは、そのMusic Player Serviceからのスニペットです。

RemoteViews views = new RemoteViews(getPackageName(),
                R.layout.statusbar);
        views.setOnClickPendingIntent(R.id.btnTest, PendingIntent
                .getActivity(getApplicationContext(), 0,
                        new Intent(getApplicationContext(),
                                MusicBrowserActivity.class),
                        PendingIntent.FLAG_UPDATE_CURRENT));
        views.setImageViewResource(R.id.icon,
                R.drawable.stat_notify_musicplayer);
        if (getAudioId() < 0) {
            // streaming
            views.setTextViewText(R.id.trackname, getPath());
            views.setTextViewText(R.id.artistalbum, null);
        } else {
            String artist = getArtistName();
            views.setTextViewText(R.id.trackname, getTrackName());
            if (artist == null || artist.equals(MediaStore.UNKNOWN_STRING)) {
                artist = getString(R.string.unknown_artist_name);
            }
            String album = getAlbumName();
            if (album == null || album.equals(MediaStore.UNKNOWN_STRING)) {
                album = getString(R.string.unknown_album_name);
            }

            views.setTextViewText(
                    R.id.artistalbum,
                    getString(R.string.notification_artist_album, artist,
                            album));
        }

        Notification status = new Notification();
        status.contentView = views;
        status.flags |= Notification.FLAG_ONGOING_EVENT;
        status.icon = R.drawable.stat_notify_musicplayer;
        status.contentIntent = PendingIntent.getActivity(this, 0,
                new Intent("com.android.music.PLAYBACK_VIEWER")
                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0);
        startForeground(PLAYBACKSERVICE_STATUS, status);

このコードではリモート ビューが使用されています。2つありTextViewsました。ボタンを追加してコードを変更し、ボタンのクリック時にアクションも実行しました。すべてのプラットフォームですべてが正常に機能しました。

同じこと、私は自分のアプリケーションで欲しい。しかし、2.2 では、上記のスクリーンショットのように見えます。テキストとボタンの色が白いためだと思い、ボタンとテキストの色を変更してみましたが、うまくいきませんでした。私が理解している限り、私が理解した唯一のことは、Android 2.2でリモートビューが膨らまないことです(私の場合)。Android 2.x プラットフォームで通知が正しく表示されない理由がわかりません。

4

1 に答える 1

2

問題を解決しました。これが私の解決策です。

private Notification generateNotification() {
        Log.d(TAG, "generateNotification called");

        Intent actionIntent = new Intent(getApplicationContext(),
                AartiActivity.class);
        PendingIntent pi = PendingIntent.getActivity(getApplicationContext(),
                0, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        RemoteViews mNotificationView = new RemoteViews(getPackageName(),
                R.layout.notification_view);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            NotificationCompat.Builder builder = new NotificationCompat.Builder(
                    getApplicationContext());
            builder.setSmallIcon(R.drawable.icon);
            builder.setContent(mNotificationView);
            builder.setOngoing(true);
            builder.setTicker("Aarti Sangrah");
            builder.setContentIntent(pi);
            mNotificationView.setImageViewResource(R.id.imgAppIc,
                    R.drawable.icon);
            mNotificationView.setTextViewText(R.id.txtAartiPlaying, mediaName);
            mNotificationView.setTextColor(R.id.txtAartiPlaying, getResources()
                    .getColor(android.R.color.holo_orange_light));

            return builder.build();
        } else {
            mNotificationView.setTextViewText(R.id.txtAartiPlaying, mediaName);
            mNotificationView.setTextColor(R.id.txtAartiPlaying, getResources()
                    .getColor(android.R.color.holo_orange_light));
            Notification statusNotification = new Notification();
            statusNotification.contentView = mNotificationView;
            statusNotification.flags |= Notification.FLAG_ONGOING_EVENT;
            statusNotification.icon = R.drawable.icon;
            statusNotification.contentIntent = PendingIntent.getActivity(this,
                    0, new Intent(getApplicationContext(), AartiActivity.class)
                            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0);
            return statusNotification;
        }
    }// generateNotification

しかし、私は静かに驚いています。NotificationCompat.Builderはサポート パッケージで利用でき、下位互換性のために提供されています。しかし、私の場合、ハニカム以上でのみ機能しています。このセクションに従って:

通知機能を設定するメソッドがサポート ライブラリ クラス NotificationCompat.Builder にある場合でも、特定のバージョンですべての通知機能を使用できるわけではありません。たとえば、展開された通知に依存するアクション ボタンは、Android 4.1 以降でのみ表示されます。これは、展開された通知自体が Android 4.1 以降でのみ使用できるためです。

しかし、私はそうは思いません。これは私の場合に当てはまります。NotificationCompat.Builder はリモート ビューで動作しますが、2.x では動作しませんでした (少なくとも私の場合、間違っているか、何かが欠けている可能性があります)。この点に関して誰かが情報やリソースを持っている場合は、間違いを理解できるように共有してください.

于 2013-08-05T12:44:12.933 に答える