diff options
| -rw-r--r-- | media/java/android/media/AudioRecord.java | 11 | ||||
| -rw-r--r-- | media/java/android/media/audiopolicy/AudioPolicy.java | 24 | ||||
| -rw-r--r-- | media/java/android/media/audiopolicy/AudioPolicyConfig.java | 2 |
3 files changed, 29 insertions, 8 deletions
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index 10accf23364c..4f2de230b60c 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -401,7 +401,7 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, int initResult = native_setup( new WeakReference<AudioRecord>(this), mAudioAttributes, sampleRate, mChannelMask, mChannelIndexMask, mAudioFormat, mNativeBufferSizeInBytes, - session, ActivityThread.currentOpPackageName(), 0 /*nativeRecordInJavaObj*/); + session, getCurrentOpPackageName(), 0 /*nativeRecordInJavaObj*/); if (initResult != SUCCESS) { loge("Error code "+initResult+" when initializing native AudioRecord object."); return; // with mState == STATE_UNINITIALIZED @@ -413,6 +413,15 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, mState = STATE_INITIALIZED; } + private String getCurrentOpPackageName() { + String opPackageName = ActivityThread.currentOpPackageName(); + if (opPackageName != null) { + return opPackageName; + } + // Command line utility + return "uid:" + Binder.getCallingUid(); + } + /** * A constructor which explicitly connects a Native (C++) AudioRecord. For use by * the AudioRecordRoutingProxy subclass. diff --git a/media/java/android/media/audiopolicy/AudioPolicy.java b/media/java/android/media/audiopolicy/AudioPolicy.java index 65f3294800f5..49867ab62cea 100644 --- a/media/java/android/media/audiopolicy/AudioPolicy.java +++ b/media/java/android/media/audiopolicy/AudioPolicy.java @@ -19,6 +19,7 @@ package android.media.audiopolicy; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.app.ActivityManager; import android.content.Context; import android.content.pm.PackageManager; import android.media.AudioAttributes; @@ -417,16 +418,12 @@ public class AudioPolicy { Log.e(TAG, "Cannot use unregistered AudioPolicy"); return false; } - if (mContext == null) { - Log.e(TAG, "Cannot use AudioPolicy without context"); - return false; - } if (mRegistrationId == null) { Log.e(TAG, "Cannot use unregistered AudioPolicy"); return false; } } - if (!(PackageManager.PERMISSION_GRANTED == mContext.checkCallingOrSelfPermission( + if (!(PackageManager.PERMISSION_GRANTED == checkCallingOrSelfPermission( android.Manifest.permission.MODIFY_AUDIO_ROUTING))) { Slog.w(TAG, "Cannot use AudioPolicy for pid " + Binder.getCallingPid() + " / uid " + Binder.getCallingUid() + ", needs MODIFY_AUDIO_ROUTING"); @@ -435,6 +432,23 @@ public class AudioPolicy { return true; } + /** + * Returns {@link PackageManager#PERMISSION_GRANTED} if the caller has the given permission. + */ + private @PackageManager.PermissionResult int checkCallingOrSelfPermission(String permission) { + if (mContext != null) { + return mContext.checkCallingOrSelfPermission(permission); + } + Slog.v(TAG, "Null context, checking permission via ActivityManager"); + int pid = Binder.getCallingPid(); + int uid = Binder.getCallingUid(); + try { + return ActivityManager.getService().checkPermission(permission, pid, uid); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + private void checkMixReadyToUse(AudioMix mix, boolean forTrack) throws IllegalArgumentException{ if (mix == null) { diff --git a/media/java/android/media/audiopolicy/AudioPolicyConfig.java b/media/java/android/media/audiopolicy/AudioPolicyConfig.java index f725cacf5f21..a56fd31fbaeb 100644 --- a/media/java/android/media/audiopolicy/AudioPolicyConfig.java +++ b/media/java/android/media/audiopolicy/AudioPolicyConfig.java @@ -18,8 +18,6 @@ package android.media.audiopolicy; import android.annotation.NonNull; import android.media.AudioFormat; -import android.media.AudioManager; -import android.media.AudioPatch; import android.media.audiopolicy.AudioMixingRule.AudioMixMatchCriterion; import android.os.Parcel; import android.os.Parcelable; |