-1

こんにちは、Android で aac プレーヤー アプリを作成しています。既に次のような通知マネージャーがあります。

Context context = getApplicationContext();
String ns = Context.NOTIFICATION_SERVICE;
int icon = R.drawable.icon;
CharSequence tickerText = "Now playing...";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
CharSequence contentTitle = "My notification";
CharSequence contentText = "txtMetaTitle";
Intent notificationIntent = new Intent(AACPlayerActivity.this, Principal.class);
notification.flags = Notification.FLAG_ONGOING_EVENT;

PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0);

notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
mNotificationManager.notify(1, notification);

しかし、今はCharSequence contentTitle = "My notifications";のような通常のテキストを挿入しようとしています。代わりに、私の場合、ストリームのshoutcastサーバーからのメタデータである変数を表示します。

ラジオ ステーションを開くと、ステーションのロゴ画像、URL、タイトルが次のコードで表示されます。

public void playerMetadata( final String key, final String value ) {
    TextView tv = null;

    if ("StreamTitle".equals( key ) || "icy-name".equals( key ) || "icy-description".equals( key )) {
        tv = txtMetaTitle;
    }
    else if ("icy-url".equals( key )) {
        tv = txtMetaUrl;
    }
    else return;

    final TextView ftv = tv;

    uiHandler.post( new Runnable() {
        public void run() {
            ftv.setText( value );
        }
    });
}

たとえば、txtMetaTitleを表示して通知に実装する方法:

CharSequence contentTitle = "My notification";
CharSequence contentText = "txtMetaTitle";

シャウトキャストのメタデータを表示するには?

どうもありがとうございました。

編集:

完全なコード:

 private void start() {
        stop();

        txtMetaTitle.setText("");
        txtMetaGenre.setText("");
        txtMetaUrl.setText("");

        multiPlayer = new MultiPlayer( this, getInt( txtBufAudio ), getInt( txtBufDecode ));

        //multiPlayer.playAsync(getUrl());

        Log.d(TAG, "onClick: starting srvice");


        myIntent = new Intent(this, MyService.class);
        myIntent.putExtra("URL", getUrl());
        myIntent.putExtra("MP",new  Sharable(multiPlayer));
        startService(myIntent);
        Context context = getApplicationContext();
        String ns = Context.NOTIFICATION_SERVICE;
        int icon = R.drawable.icon;
        CharSequence tickerText = "Now playing...";
        long when = System.currentTimeMillis();
        Notification notification = new Notification(icon, tickerText, when);
        CharSequence contentTitle = "My notification";
        CharSequence contentText = txtMetaTitle.getText();
        Intent notificationIntent = new Intent(AACPlayerActivity.this, Principal.class);
        notification.flags = Notification.FLAG_ONGOING_EVENT;

        PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0);

        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
       NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
       mNotificationManager.notify(1, notification);
    }

この内部で通知サービスを移動するのを修正しました:

 public void playerMetadata( final String key, final String value ) {
        TextView tv = null;

        if ("StreamTitle".equals( key ) || "icy-name".equals( key ) || "icy-description".equals( key )) {
            tv = txtMetaTitle;
        }
        else if ("icy-url".equals( key )) {
            tv = txtMetaUrl;
        }
        else return;

        final TextView ftv = tv;

        uiHandler.post( new Runnable() {
            public void run() {
                ftv.setText( value );
                System.out.println("Now playing..." + txtMetaTitle.getText().toString());
                Context context = getApplicationContext();
                String ns = Context.NOTIFICATION_SERVICE;
                int icon = R.drawable.icon;
                CharSequence tickerText = "Now playing...";
                long when = System.currentTimeMillis();
                Notification notification = new Notification(icon, tickerText, when);
                CharSequence contentTitle = txtMetaTitle.getText().toString();
                CharSequence contentText = txtMetaUrl.getText().toString();
                Intent notificationIntent = new Intent(AACPlayerActivity.this, Principal.class);
                notification.flags = Notification.FLAG_ONGOING_EVENT;
                PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);

                //PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0);

                notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
               NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
               mNotificationManager.notify(1, notification);
            }
        });
    }
4

1 に答える 1

1

デフォルトの通知レイアウトでは、タイトルとテキストの2行が表示されます。それ以上の柔軟性が必要な場合は、カスタムレイアウトを作成する必要があります。

タイトルとテキストを設定する代わりに、をインスタンス化しますRemoteViews

RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom);

次に、それを通知オブジェクトに設定します。

mNotification.contentView = contentView;

RemoteViews通常のビューとは少し異なる動作をします。オブジェクトのメソッドを呼び出してRemoteViews、内部のビューに値を設定する必要があります。例えば、

contentView.setTextViewText(R.id.text_view_id, "Hello, world.");

ご覧のとおり、レイアウトで使用できるビューの種類と、それらで呼び出すことができるメソッドは制限されています。

于 2012-10-19T22:23:46.813 に答える