检测另一个应用程序是否正在请求麦克风
Detect if another app is requesting the microphone
我在 SO 上看到了多个问题,它们说不可能看到另一个应用程序何时想要使用 microphone (Unable to access microphone when another app is using it in Android)。但是,我知道这是可能的,因为 Shazam 有一个 "Auto" 功能,可以实现我想要的确切功能:在其他应用程序未使用 microphone.
时连续收听音频
目前,当我使用我的应用程序并使用像 Snapchat 这样的应用程序时,我无法录制带音频的视频,因为 Snapchat 不会接管麦克风。但是,正如我之前所说,在这种情况下,Shazam 的自动功能可以正常工作。
那么我该如何监听其他应用程序何时要使用麦克风?我可以使用 "hack" 的东西,只要它不需要生根 phone 或类似的东西。
编辑:
Shazam 从来没有这个功能,他们的应用程序无法在 运行.
时将麦克风交给其他应用程序
这是我目前最好的解决方案。无法监听请求麦克风的其他应用程序,因此我创建了一个每 3 秒运行一次的 UsageStats
检查器,以查看当前打开的应用程序是否具有请求音频的能力。如果您有更好的东西或对此进行改进,请告诉我。
注意:您必须将权限添加到应用程序清单:
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(), getPackageName());
if (mode != AppOpsManager.MODE_ALLOWED) {
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);
}
if (otherAppAudioTimer != null) {
otherAppAudioTimer.cancel();
}
otherAppAudioTimer = new Timer();
otherAppAudioTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
UsageStatsManager usm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
long now = System.currentTimeMillis();
final List<UsageStats> queryUsageStats = usm.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, now - (1000 * 60 * 60), now);
if (queryUsageStats != null && queryUsageStats.size() > 0) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<>();
for (UsageStats usageStats : queryUsageStats) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (!mySortedMap.isEmpty()) {
String currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
boolean hasRecordAudio = getPackageManager()
.checkPermission(Manifest.permission.RECORD_AUDIO, currentApp)
== PackageManager.PERMISSION_GRANTED;
if (getApplicationContext().getPackageName().equals(currentApp)) {
Log.e("hasAudio", "Current app is self");
return;
}
if (hasRecordAudio) {
//the current app can record audio
} else {
//the current app cannot record audio
}
}
}
}
}, 0, 3000);
我在 SO 上看到了多个问题,它们说不可能看到另一个应用程序何时想要使用 microphone (Unable to access microphone when another app is using it in Android)。但是,我知道这是可能的,因为 Shazam 有一个 "Auto" 功能,可以实现我想要的确切功能:在其他应用程序未使用 microphone.
时连续收听音频目前,当我使用我的应用程序并使用像 Snapchat 这样的应用程序时,我无法录制带音频的视频,因为 Snapchat 不会接管麦克风。但是,正如我之前所说,在这种情况下,Shazam 的自动功能可以正常工作。
那么我该如何监听其他应用程序何时要使用麦克风?我可以使用 "hack" 的东西,只要它不需要生根 phone 或类似的东西。
编辑: Shazam 从来没有这个功能,他们的应用程序无法在 运行.
时将麦克风交给其他应用程序这是我目前最好的解决方案。无法监听请求麦克风的其他应用程序,因此我创建了一个每 3 秒运行一次的 UsageStats
检查器,以查看当前打开的应用程序是否具有请求音频的能力。如果您有更好的东西或对此进行改进,请告诉我。
注意:您必须将权限添加到应用程序清单:
<uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(), getPackageName());
if (mode != AppOpsManager.MODE_ALLOWED) {
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);
}
if (otherAppAudioTimer != null) {
otherAppAudioTimer.cancel();
}
otherAppAudioTimer = new Timer();
otherAppAudioTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
UsageStatsManager usm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
long now = System.currentTimeMillis();
final List<UsageStats> queryUsageStats = usm.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, now - (1000 * 60 * 60), now);
if (queryUsageStats != null && queryUsageStats.size() > 0) {
SortedMap<Long, UsageStats> mySortedMap = new TreeMap<>();
for (UsageStats usageStats : queryUsageStats) {
mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
}
if (!mySortedMap.isEmpty()) {
String currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
boolean hasRecordAudio = getPackageManager()
.checkPermission(Manifest.permission.RECORD_AUDIO, currentApp)
== PackageManager.PERMISSION_GRANTED;
if (getApplicationContext().getPackageName().equals(currentApp)) {
Log.e("hasAudio", "Current app is self");
return;
}
if (hasRecordAudio) {
//the current app can record audio
} else {
//the current app cannot record audio
}
}
}
}
}, 0, 3000);