1

私のアプリケーションでは、デバイスのオーディオ ジャックを使用するカード リーダーが 1 つあります。今、私の問題は、カード リーダーがデバイスのヘッドフォン ジャックにそのままあるときに、内蔵スピーカーから音を出したいということです。

私が試したコードは次のとおりです。

1) リフレクション手法の使用

Class audioSystemClass;
                try {
                     audioSystemClass = Class
                            .forName("android.media.AudioSystem");

                    Method setForceUse = audioSystemClass.getMethod(
                            "setForceUse", int.class, int.class);
                    // First 1 == FOR_MEDIA, second 1 == FORCE_SPEAKER. To go
                    // back to the default
                    // behavior, use FORCE_NONE (0).
                    setForceUse.invoke(null, 1, 1);
                    final float maxVolume = mAudioManager
                            .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
                    soundPool.play(soundID, maxVolume, maxVolume, 1, 0, 1f);


                } catch (ClassNotFoundException e) {
                    Log.e("Test", e.toString());
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    Log.e("Test", e.toString());
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    Log.e("Test", e.toString());
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    Log.e("Test", e.toString());
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    Log.e("Test", e.toString());
                    e.printStackTrace();
                }

2) setMode メソッドの使用

mAudioManager.setMode(AudioManager.MODE_IN_CALL);
                mAudioManager.setSpeakerphoneOn(true);
                float maxVolume = mAudioManager
                        .getStreamMaxVolume(AudioManager.STREAM_RING);
                soundPool.play(soundID, maxVolume, maxVolume, 1, 0, 1f);

ただし、これらの両方のコードは、デフォルトの FM アプリケーションを備えたデバイスでのみ実行されます。しかし、私はこの機能をすべてのデバイスに搭載したいと考えています。

あなたの経験を共有してください!!

4

3 に答える 3

0

2 番目のアプローチ setMode は、デフォルトの Fm プレーヤーを備えた電話で正しく保持されます。

ただし、 Default FM のないデバイスの場合、次のコードを試しました。

mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
mAudioManager.setSpeakerphoneOn(true);

このコードは、デフォルトの Fm プレーヤーのない電話では問題なく動作しました。私は Oxygen OS を搭載した OnePlus デバイスを使用し、問題なく動作しました。お役に立てれば。

于 2015-06-10T08:02:09.337 に答える
0

ここでは、SoundPool を開始し、ビープ音をロードしました。

 SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_VOICE_CALL, 0);

            soundPool
                    .setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {

                        @Override
                        public void onLoadComplete(SoundPool soundPool,
                                                   int sampleId, int status) {
                            loaded = true;
                        }
                    });
            soundID = soundPool.load(ApplicationChexology.getContext(), R.raw.beep_single, 1);

今、 sound を読み込んだ後、 AudioManager を MODE_IN_COMMUNICATION に設定してサウンドを再生しています。サウンドが再生されたら、Audio Manager のモードを MODE_NORMAL に設定します。

 audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
 audioManager.setSpeakerphoneOn(true);

 float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        if (loaded)
         soundPool.play(soundID, maxVolume, maxVolume, 1, 0, 1f);

        Timer timer = new Timer();

        TimerTask delayedThreadStartTask = new TimerTask() {
          @Override
          public void run() {
             audioManager.setMode(AudioManager.MODE_NORMAL);
             audioManager.setSpeakerphoneOn(false);

                }};
    timer.schedule(delayedThreadStartTask, 500);
于 2015-06-15T07:43:39.003 に答える
0

または、SoundPool を STREAM_VOICE_CALL に初期化すると、次のようになります。

SoundPool spool = new SoundPool(1,AudioManager.STREAM_VOICE_CALL, 0)

次に、上記のいずれかの方法でオーディオをラウドスピーカーにルーティングする必要があります。デフォルトのFMがなくても電話で試してみました。

于 2015-06-10T09:42:48.760 に答える