Я хочу программно сделать «медиа ключ следующий» в моем apk, чтобы воспроизвести следующую песню в проигрывателе, который воспроизводится в данный момент. Я просто не могу заставить это работать. Я попробовал 3 варианта (см. Код ниже), и ничего не работает. Делать это из терминала (напрямую или через adb), выдавая «input keyevent 87», работает нормально. Запуск скрипта из / system / bin также работает нормально.
Я попытался запустить это на 2 головных устройствах Android. Один работает под управлением Android 6.0.1, другой - под управлением Android 8.0.0. Оба имеют корни, но я ими не пользуюсь и не думаю, что мне нужно это использовать.
РЕДАКТИРОВАТЬ: Я впервые попробовал ВАРИАНТ 0.
Тогда я "// ПЕРВЫЙ ВАРИАНТ ОПЦИИ" в коде ниже.
Затем я попробовал это с помощью нескольких параметров командной оболочки (опция 2 и 3 в коде ниже).
Ничего не работает Я предполагаю, что делаю что-то глупое, но я не могу понять, что.
Мой пример apk
package org.hvdw.mediakeynext;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.content.Context;
import android.content.Intent;
//import android.media.AudioManager;
//shellExec
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
public class MediaKeyNext extends Activity {
public static final String TAG = "MediaKeyNext";
private static Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getApplicationContext();
Log.d(TAG, "Started MediaKeyNext; in OnCreate void");
// OPTION 0
/*AudioManager mAudioManager = (AudioManager) mContext.getSystemService(mContext.AUDIO_SERVICE);
if (mAudioManager.isMusicActive()) {
Intent sIntent = new Intent("com.android.music.musicservicecommand");
sIntent.putExtra("command" , "next" );
mContext.sendBroadcast(sIntent);
}*/
// FIRST OPTION TRIED
/*AudioManager mAudioManager = (AudioManager) mContext.getSystemService(mContext.AUDIO_SERVICE);
Intent sIntent = new Intent("com.android.music.musicservicecommand");
sIntent.putExtra("command" , "next" );
mContext.sendBroadcast(sIntent); */
// SECOND OPTION TRIED
//shellExec("/system/bin/mediakeynext.sh");
// THIRD OPTION TRIED
try {
Process p = Runtime.getRuntime().exec("/system/bin/mediakeynext.sh");
Log.d(TAG, "/system/bin/mediakeynext.sh");
} catch (Exception e) {
e.printStackTrace();
Log.d(TAG, e.getMessage());
}
Log.d(TAG, "Executed the mediakeynext command");
finish();
}
// USED METHODS FOR OPTION 2
public static String shellExec(String... strings) {
String res = "";
DataOutputStream outputStream = null;
InputStream response = null;
try {
Process sh = Runtime.getRuntime().exec("sh");
outputStream = new DataOutputStream(sh.getOutputStream());
response = sh.getInputStream();
for (String s : strings) {
s = s.trim();
outputStream.writeBytes(s + "\n");
outputStream.flush();
}
outputStream.writeBytes("exit\n");
outputStream.flush();
try {
sh.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
res = readFully(response);
} catch (IOException e) {
e.printStackTrace();
Log.d(TAG, e.getMessage());
} finally {
Closer.closeSilently(outputStream, response);
}
return res;
}
public static String readFully(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = 0;
while ((length = is.read(buffer)) != -1) {
baos.write(buffer, 0, length);
}
return baos.toString("UTF-8");
}
}
Исходный файл Closer.java
package org.hvdw.mediakeynext;
import java.io.Closeable;
import java.net.DatagramSocket;
import java.net.Socket;
//copied from https://stackoverflow.com/questions/20932102/execute-shell-command-from-android/26654728
// from the code of CarloCannas
public class Closer {
// closeAll()
public static void closeSilently(Object... xs) {
// Note: on Android API levels prior to 19 Socket does not implement Closeable
for (Object x : xs) {
if (x != null) {
try {
//Log.d("closing: "+x);
if (x instanceof Closeable) {
((Closeable)x).close();
} else if (x instanceof Socket) {
((Socket)x).close();
} else if (x instanceof DatagramSocket) {
((DatagramSocket)x).close();
} else {
//Log.d("cannot close: "+x);
throw new RuntimeException("cannot close "+x);
}
} catch (Throwable e) {
//Log.x(e);
}
}
}
}
}
Используемый скрипт оболочки
#!/system/bin/sh
input keyevent 87
Сообщения об ошибках не отображаются.
Журнал просто дает такие строки, как
06-23 12:34:40.275 6259 6259 D MediaKeyNext: Started MediaKeyNext; in OnCreate void
06-23 12:34:40.294 6259 6259 D MediaKeyNext: /system/bin/mediakeynext.sh
06-23 12:34:40.295 6259 6259 D MediaKeyNext: Executed the mediakeynext command