summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/AudioRecord.java11
-rw-r--r--media/java/android/media/audiopolicy/AudioPolicy.java24
-rw-r--r--media/java/android/media/audiopolicy/AudioPolicyConfig.java2
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;