Сделать это без обслуживания
http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion
Если вы так серьезно относитесь к тому, чтобы делать это с помощью службы mediaplayer
Intent svc=new Intent(this, BackgroundSoundService.class);
startService(svc);
public class BackgroundSoundService extends Service {
private static final String TAG = null;
MediaPlayer player;
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
player = MediaPlayer.create(this, R.raw.idil);
player.setLooping(true); // Set looping
player.setVolume(100,100);
}
public int onStartCommand(Intent intent, int flags, int startId) {
player.start();
return 1;
}
public void onStart(Intent intent, int startId) {
// TO DO
}
public IBinder onUnBind(Intent arg0) {
// TO DO Auto-generated method
return null;
}
public void onStop() {
}
public void onPause() {
}
@Override
public void onDestroy() {
player.stop();
player.release();
}
@Override
public void onLowMemory() {
}
}
Пожалуйста, позвоните в эту службу в манифест. Убедитесь, что в конце .BackgroundSoundService string
0xFF
- это шестнадцатеричная константа, которая является 11111111
в двоичном формате. Используя побитовое И (&
) с этой константой, он оставляет только последние 8 бит оригинала (в этом случае, независимо от cv2.waitKey(0)
).
Честно, в этом случае вам не нужно 0xFF. Если вы сделали cv2.waitkey(0) == ord(q)
, это все равно будет работать. 0xFF
используется только для маскировки последней 8bits
последовательности, а ord () любого символа клавиатуры не будет больше 255. Вы можете ссылаться на эту таблицу ASCII , чтобы найти числовую значения любого символа клавиатуры.
ord (c) возвращает целое число, представляющее кодовую точку Юникода символа (с), когда аргумент является объектом юникода, или значением байта, когда аргумент является 8-битовой строкой.
В случае 64-битных систем значение cv2.waitKey (0) является побитовым AND (& amp;) с шестнадцатеричной константой 0xFF (которая представляет собой двоичную строку 11111111 ), что приводит к последним 8 битам. Таким образом, проверяя eqality с ord (c).
cv2.waitKey () возвращает 32-битное целочисленное значение (может зависеть от платформы). Ввод ключа находится в ASCII, который представляет собой 8-битное целочисленное значение. Таким образом, вы только заботитесь об этих 8 бит и хотите, чтобы все остальные биты были равны 0. Этого можно достичь с помощью:
cv2.waitKey(0) & 0xFF
Также важно отметить, что ord ('q') может возвращать разные числа, если активирован NumLock (возможно, это также происходит с другими клавишами). Например, при нажатии c код:
key = cv2.waitKey(10)
print(key)
возвращает
1048675 when NumLock is activated
99 otherwise
Преобразование этих двух чисел в двоичный файл можно увидеть:
1048675 = 100000000000001100011
99 = 1100011
Как мы видим, последний байт идентичен. Затем необходимо взять только этот последний байт, поскольку остальное вызвано из-за состояния NumLock. Таким образом, мы выполняем:
key = cv2.waitKey(33) & 0b11111111
# 0b11111111 is equivalent to 0xFF
, а значение ключа останется прежним, и теперь мы можем сравнить его с любой клавишей, которую мы хотели бы задать, например, ваш вопрос
if key == ord('q'):