Как мне исправить мой "медиа ключ дальше" в моем Android APK - PullRequest
0 голосов
/ 23 июня 2019

Я хочу программно сделать «медиа ключ следующий» в моем 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
...