3

リフレクションを使用して AudioManager.startBluetoothSco() メソッドを呼び出しています。2.2 以降の SDK にのみ存在するため、リフレクションを介して行う必要がありますが、私のアプリは 2.0 の最小バージョン用にビルドされています。ProGuard を使用せずにアプリをコンパイルすると、すべて正常に動作します。メソッドは 2.2 では適切に呼び出されますが、それ以前のバージョンではまったく呼び出されません。しかし、ProGuard を使用すると、まったく機能しません。これを修正するProGuard構成にKEEPステートメントがあると思いますが、それがどうあるべきかわかりません。私のコードからの3行は次のとおりです。

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
Method startBT = AudioManager.class.getMethod("startBluetoothSco");   
startBT.invoke(am);
4

1 に答える 1

1

リフレクションの代わりに遅延読み込みを使用することをお勧めします - その方が高速で、ProGuard も問題なく動作すると思います: http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake- and-eat-it-too.html

これは、StrictMode を有効にする現在のプロジェクトの簡単な例です (利用可能な場合):

public abstract class StrictModeUtil {

    private static class GingerbreadAndBeyond extends StrictModeUtil {

        private static class Holder {
            private static final GingerbreadAndBeyond INSTANCE = new GingerbreadAndBeyond();
        }

        public GingerbreadAndBeyond() {
            // we just enable StrictMode here, but only in developer mode
            if (C.D) {
                android.os.StrictMode.enableDefaults();
            }
        }
    }

    public static StrictModeUtil getInstance() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
            return GingerbreadAndBeyond.Holder.INSTANCE;
        } else {
            // we don't need an implementation before Android 2.3
            return null;
        }
    }

}
于 2011-02-22T14:56:54.013 に答える