2016-07-26 13 views
6

Tôi đang phát triển ứng dụng phát trực tuyến âm thanh cho Android và tích hợp Android Auto. Tôi đã làm theo hai hướng dẫn này.Ứng dụng Android Auto không bao giờ gọi trênGetRoot

Android Developer Training

PTR Android Blog

Sử dụng Head Unit Desktop, tôi có thể chọn ứng dụng phương tiện truyền thông của tôi từ danh sách ứng dụng phương tiện truyền thông, nhưng từ đó một ProgressBar vẫn thay vì nhường chỗ cho các "Để chơi một cái gì đó, mở menu ở trên cùng bên trái. " thông báo được thấy trong số Universal Music Player.

Khi kiểm tra, có vẻ như's onGetRoot() không bao giờ được gọi và do đó không bao giờ điền MediaItemCompat vào danh sách ứng dụng Auto.

Tệp kê khai của tôi chứa thông tin sau.

<manifest package="com.app.audio" 
     xmlns:android="http://schemas.android.com/apk/res/android"> 

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="android.permission.RECORD_AUDIO"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

<application 
    android:name="com.app.audio.AudioApp" 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"> 


    <activity 
     android:name="com.app.audio.presentation.home.HomeActivity" 
     android:label="@string/app_name" 
     android:launchMode="singleTop"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 

      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

    <activity 
     android:name="com.app.audio.presentation.weather.WeatherActivity" 
     android:screenOrientation="userPortrait"/> 

    <activity android:name="com.app.audio.presentation.settings.SettingsActivity"/> 

    <activity android:name="com.app.audio.presentation.alarm.AlarmActivity"/> 

    <activity android:name="com.app.audio.presentation.sleep.SleepActivity"/> 

    <receiver android:name="com.app.audio.audio.AudioIntentReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.MEDIA_BUTTON"/> 
      <action android:name="android.media.AUDIO_BECOMING_NOISY"/> 
     </intent-filter> 
    </receiver> 

    <receiver android:name="com.app.audio.presentation.alarm.AlarmReceiver"></receiver> 

    <receiver android:name="com.app.audio.presentation.sleep.SleepReceiver"></receiver> 

    <service 
     android:name="com.app.audio.data.service.media.MediaService" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.media.browse.MediaBrowserService"/> 
     </intent-filter> 
    </service> 

    <meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version"/> 

    <meta-data 
     android:name="com.google.android.gms.car.application" 
     android:resource="@xml/automotive_app_desc"/> 

    <meta-data 
     android:name="com.google.android.gms.car.notification.SmallIcon" 
     android:resource="@drawable/ic_launcher"/> 
</application> 

My automotive_app_desc.xml rất đơn giản, chỉ tuyên bố Media.

<?xml version="1.0" encoding="utf-8"?> 
<automotiveApp> 
    <uses name="media"/> 
</automotiveApp> 

My MediaService mở rộng MediaBrowserServiceCompat. Trong số onCreate() tôi tạo và đặt MediaSessionCompat của mình.

@Override 
public void onCreate() { 
    super.onCreate(); 
    //... 
    mediaSession = new MediaSessionCompat(
      this, 
      SESSION_TAG, 
      mediaIntentReceiver, 
      null 
    ); 

    mediaSession.setFlags(
      MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | 
        MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); 

    mediaSession.setCallback(new MediaSessionCompat.Callback() { 
     @Override 
     public void onPlay() { 
      super.onPlay(); 
      play(selectedStream); 
     } 

     @Override 
     public void onPause() { 
      super.onPause(); 
      pause(); 
     } 

     @Override 
     public void onStop() { 
      super.onStop(); 
      stop(); 
     } 

     @Override 
     public void onSkipToNext() { 
      super.onSkipToNext(); 
      playNextStation(); 
     } 

     @Override 
     public void onSkipToPrevious() { 
      super.onSkipToPrevious(); 
      playPreviousStation(); 
     } 
    }); 

    mediaSession.setActive(true); 
    setSessionToken(mediaSession.getSessionToken()); 
    updatePlaybackState(ACTION_STOP); 
} 

Cuối cùng, hai phương pháp ghi đè từ MediaBrowserServiceCompat, trong đó không bao giờ được gọi.

@Nullable 
@Override 
public BrowserRoot onGetRoot(@NonNull String clientPackageName, int clientUid, @Nullable Bundle rootHints) { 
    return new BrowserRoot(ROOT_ID, null); 
} 

@Override 
public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaBrowserCompat.MediaItem>> result) { 
    List<MediaBrowserCompat.MediaItem> items = getMediaItemsById(parentId); 
    if (items != null) { 
     result.sendResult(items); 
    } 
} 

Theo như tôi có thể nói, đó là tất cả những gì cần thiết để có được một Android Auto bắt đầu, nhưng khi tôi mở ứng dụng trên thiết bị đầu máy tính để bàn của tôi, chỉ có một ProgressBar chào tôi, và khi tôi mở ra ngăn kéo nav -screen, có một cái khác. Tôi đã không nghe nói về trạng thái đó trong bất kỳ tài liệu nào tôi đã đọc. Có điều gì tôi đã bỏ lỡ?

Trả lời

8

Cuối cùng, vấn đề không liên quan gì đến những gì tôi mô tả. Các MediaService nói trên cũng thực hiện các tác vụ khác yêu cầu Binder tùy chỉnh. Tùy chỉnh Binder này không gọi số onGetRoot() cần thiết cho Đơn vị đứng đầu. Để giải quyết, tôi kiểm tra hành động Intent và trả lại super.onBind() khi từ số MediaBrowserServiceCompat.

@Override 
public IBinder onBind(Intent intent) { 
    if (SERVICE_INTERFACE.equals(intent.getAction())) { 
     return super.onBind(intent); 
    } 
    return new MediaBinder(); 
} 

SERVICE_INTERFACE là hằng số trong MediaBrowserServiceCompat.

+1

Cảm ơn bạn rất nhiều vì đã đăng giải pháp này.Tôi đã gỡ lỗi này trong nhiều giờ. –

0

Tôi đang phát triển một tự động Android nhưng tôi có một số vấn đề trong phần này của mã của tôi, trong Onbind phương pháp của dịch vụ:

public IBinder onBind(Intent arg0) { 
    Log.i("TAG", "OnBind"); 
    // TODO Auto-generated method stub 
    if (SERVICE_INTERFACE.equals(arg0.getAction())) { 
     Log.i("TAG", "SERVICE_INTERFACE"); 
     registerReceiver(receiver, filter); 
     return super.onBind(arg0); 
    } else { 
     Log.i("Musica Service", "musicBind"); 
     return musicBind;} 
} 

tôi có các hoạt động khác liên kết với dịch vụ của mình thông qua một musicBind IBinder, nhưng mặt khác, tôi đã thiết lập tất cả mọi thứ để kết nối ứng dụng của mình trong giao diện tự động của Android nhưng sau khi đóng ứng dụng của tôi sau khi ngắt kết nối thiết bị khỏi ô tô android, tôi không thể dừng tính năng tương thích mediabrowserservice của mình. Tôi nghĩ rằng đó là do điều này SERVICE_INTERFACE giữ ràng buộc các dịch vụ. Làm thế nào tôi có thể dừng hoặc hủy bỏ điều này từ cùng một số servicemediabrowserservicecompat?

+1

Chào mừng bạn đến với Stack Overflow. Đây không phải là câu trả lời cho câu hỏi, đó là một bình luận/câu hỏi mới. Khi bạn có đủ danh tiếng (50), bạn sẽ có thể nhận xét về bất kỳ bài đăng nào. Trong thời gian chờ đợi, bạn có thể đạt được danh tiếng [** đặt câu hỏi của riêng bạn **] (http://stackoverflow.com/help/how-to-ask) hoặc [** cung cấp câu trả lời trên chủ đề **] (http://stackoverflow.com/help/how-to-answer). – Vickel

Các vấn đề liên quan