- Androids medialibbar suger hästdelar.
- Allt bra "kommer sen" (i det här fallet Open AL och mer native-nära funktioner)
Så tills vidare trodde jag förstås att jag var, som undomarna säger idag, rökt. Men av en magisk slump (eller idogt googlande) landade jag på implementationen av de medföljande visualiseringarna av musik i Androidkällkoden, där en metod med namnet "snoop"användes flitigt på mediaspelarklassen som jag ansåg vara värd en extra titt. Efter att ha förundrats över det faktum att jag tydligen inte kunde anropa denna fina metod (eller ens bevisa dess existens i min utvecklingsmiljö) fick jag en snabb lektion i en annotering med det snillrika namnet @Hide. Denna annotering används på metoder som inte anses vara dokumenterbar/förvaltningsbar i Androids källkod (men förmodligen kommer att bli det iom att den finns kvar). Eftersom jag inte har lust att kompilera några stubbar/bygga om Androidprylar från source kom jag raskt att tänka på perfektionen i att reflektera. Så utan mera omsvävningar, här kommer hur du anropar en metod i Android (förslagsvis snoopmetoden på MediaPlayer i det här fallet) på ett mer eller mindre tjusigt sätt tills den slutar gömmas:
short [] mVizData = new short[1024];In your face @Hide annoteringen, det där är vad man får om man försöker gömma metoder för folk.
try {
Class<MediaPlayer>myEvilMediaPlayer = (Class<MediaPlayer> ) Class.forName(MediaPlayer.class.getName());
try {
Class[] parameterTypes = new Class[] {short[].class, int.class};
Method snoop = myEvilMediaPlayer.getMethod("snoop", parameterTypes);
snoop.setAccessible(true);
Object[] arguments = new Object[2];
arguments[0] = mVizData;
arguments[1] = 0;
int x = (Integer) snoop.invoke(myEvilMediaPlayer, arguments);
System.out.println(x);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Mind The Robot har bloggat lite om olika audio-APIer i Android. Kanske kan vara kul att läsa.
SvaraRaderahttp://mindtherobot.com/blog/624/android-audio-play-an-mp3-file-on-an-audiotrack/
Allt löser sig nu när dom kommer implementera OpenAL och köra ALSAgrejjs. Men var roligt att hitta @Hide prylar, kommer snart ett ballt wallpaper nära dig tror jag. :)
SvaraRadera