これを行う特定の方法は (残念ながら) ありません。エラーが発生するのは、mic リソースを使用しようとするアプリケーションだけです。
できることは、ユーザーがバックグラウンドで何をしているかを監視し、それに応じて反応することです。Google Now がフォアグラウンド アプリケーションになったかどうかを確認するコードは次のとおりです。
public static boolean googleNowForeground(final Context ctx) {
final ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
if (activityManager.getRunningTasks(1).get(0) != null) {
final PackageManager pm = ctx.getPackageManager();
try {
final PackageInfo foregroundAppPackageInfo = pm.getPackageInfo(
activityManager.getRunningTasks(1).get(0).topActivity.getPackageName(), 0);
if (foregroundAppPackageInfo != null) {
if (foregroundAppPackageInfo.packageName.matches(Constants.GOOGLE_NOW_PACKAGE_NAME)) {
return true;
}
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
return false;
}
これは、そのようなアクションを実行するために私が見つけた最も「費用のかからない」方法ですが、上記の方法が将来の OS バージョンで呼び出されることは保証されていません。 .
アプリケーションと競合することがわかっているフォアグラウンド アプリケーションの監視の「費用」は、オーディオを永続的に記録する場合と比べていくらか最小限に抑えられる可能性がありますが、特定のデバイス条件パラメータ内で監視を最小限に抑えるように実装を賢明にコーディングする必要があります。
マイク リソースに関連付けられているインテント ブロードキャストを監視する他の方法を調査しましたが、上記の方法ほど成功していません。
競合するアプリケーションの「除外リスト」を作成するようユーザーに要求すると、競合するアプリケーションがフォアグラウンド アプリケーションになるかどうかを動的に監視し、それに応じて対応することができます。
それが役立つことを願って....