diff --git a/OWNERS b/OWNERS
index f0f7c14..e2dc47b 100644
--- a/OWNERS
+++ b/OWNERS
@@ -2,3 +2,5 @@
 # Please update this list if you find better candidates.
 stenning@google.com
 ajchen@google.com
+igorr@google.com
+arnaudberry@google.com
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7e4e990..ac6d4a1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -21,6 +21,8 @@
     <string name="genres_title">Genres</string>
     <string name="albums_title">Albums</string>
     <string name="playback_error">Something went wrong.</string>
+    <string name="permission_error">Missing permission.</string>
+    <string name="permission_error_resolve">Grant permission</string>
     <string name="playlist">Now Playing</string>
     <string name="shuffle">Shuffle</string>
 
diff --git a/src/com/android/car/media/localmediaplayer/LocalMediaBrowserService.java b/src/com/android/car/media/localmediaplayer/LocalMediaBrowserService.java
index 6f3e5fd..26a440f 100644
--- a/src/com/android/car/media/localmediaplayer/LocalMediaBrowserService.java
+++ b/src/com/android/car/media/localmediaplayer/LocalMediaBrowserService.java
@@ -113,10 +113,6 @@
     public void onCreate() {
         super.onCreate();
 
-        if (!Utils.hasRequiredPermissions(this)) {
-            Utils.startPermissionRequest(this);
-        }
-
         mDataModel = new DataModel(this);
         addRootItems();
         mSession = new MediaSession(this, MEDIA_SESSION_TAG);
diff --git a/src/com/android/car/media/localmediaplayer/Player.java b/src/com/android/car/media/localmediaplayer/Player.java
index 2bb763b..e39b394 100644
--- a/src/com/android/car/media/localmediaplayer/Player.java
+++ b/src/com/android/car/media/localmediaplayer/Player.java
@@ -173,7 +173,7 @@
         }
         // Check permissions every time we try to play
         if (!Utils.hasRequiredPermissions(mContext)) {
-            Utils.startPermissionRequest(mContext);
+            setMissingPermissionError();
         } else {
             requestAudioFocus(() -> resumePlayback());
         }
@@ -231,6 +231,25 @@
         editor.commit();
     }
 
+    private void setMissingPermissionError() {
+        Intent prefsIntent = new Intent();
+        prefsIntent.setClass(mContext, PermissionsActivity.class);
+        prefsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, prefsIntent, 0);
+
+        Bundle extras = new Bundle();
+        extras.putString(Utils.ERROR_RESOLUTION_ACTION_LABEL,
+                mContext.getString(R.string.permission_error_resolve));
+        extras.putParcelable(Utils.ERROR_RESOLUTION_ACTION_INTENT, pendingIntent);
+
+        PlaybackState state = new PlaybackState.Builder()
+                .setState(PlaybackState.STATE_ERROR, 0, 0)
+                .setErrorMessage(mContext.getString(R.string.permission_error))
+                .setExtras(extras)
+                .build();
+        mSession.setPlaybackState(state);
+    }
+
     private boolean maybeRebuildQueue(Playlist playlist) {
         List<QueueItem> queue = new ArrayList<>();
         int foundIdx = 0;
@@ -269,6 +288,10 @@
     }
 
     public boolean maybeRestoreState() {
+        if (!Utils.hasRequiredPermissions(mContext)) {
+            setMissingPermissionError();
+            return false;
+        }
         String serialized = mSharedPrefs.getString(CURRENT_PLAYLIST_KEY, null);
         if (serialized == null) {
             return false;
diff --git a/src/com/android/car/media/localmediaplayer/Utils.java b/src/com/android/car/media/localmediaplayer/Utils.java
index d761794..5df3760 100644
--- a/src/com/android/car/media/localmediaplayer/Utils.java
+++ b/src/com/android/car/media/localmediaplayer/Utils.java
@@ -27,6 +27,12 @@
         android.Manifest.permission.READ_EXTERNAL_STORAGE
     };
 
+    static final String ERROR_RESOLUTION_ACTION_INTENT =
+            "android.media.extras.ERROR_RESOLUTION_ACTION_INTENT";
+
+    static final String ERROR_RESOLUTION_ACTION_LABEL =
+            "android.media.extras.ERROR_RESOLUTION_ACTION_LABEL";
+
     static Uri getUriForResource(Context context, int id) {
         Resources res = context.getResources();
         return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE
@@ -43,12 +49,4 @@
         }
         return true;
     }
-
-    static void startPermissionRequest(Context context) {
-        if (!Utils.hasRequiredPermissions(context)) {
-            Intent intent = new Intent(context, PermissionsActivity.class);
-            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            context.startActivity(intent);
-        }
-    }
 }
