Как использовать MIDI API в Android Studio - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время я разрабатываю приложение, которое должно помочь вам научиться читать заметки.Поэтому я хочу подключить свое цифровое пианино и получать миди-сигналы.

К сожалению, я не могу заставить его работать.Это официальная ссылка на API

https://developer.android.com/reference/android/media/midi/package-summary

Я использую класс GameView для рисования на холсте.Я установил экземпляр MidiManager

MidiManager m = (MidiManager)context.getSystemService(Context.MIDI_SERVICE);

Но когда я пытаюсь использовать метод

m.registerDeviceCallback(new MidiManager.DeviceCallback() {
    public void onDeviceAdded( MidiDeviceInfo info ) {
      ...
    }
    public void onDeviceRemoved( MidiDeviceInfo info ) {
      ...
    }
  });

и подставляю точки для некоторого кода, я получаю сообщение об ошибке

registerDeviceCallback в MidiManager не может быть применен к DeviceCallback

Я также обнаружил, что класс MidiManager сам по себе имеет 29 ошибок (без редактирования)

Ядовольно плохо знакомы с Java и Android Studio и не могут найти учебники по этому вопросу.

Это мой класс GameView

package com.maiergames.gameprototype;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.midi.MidiDeviceInfo;
import android.media.midi.MidiManager;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.util.LinkedList;




public class GameView extends SurfaceView implements SurfaceHolder.Callback {

    private MainThread thread;
    private Bitmap line;
    private Scanner scanner;
    private InstanceCreator instanceCreator;
    private Bitmap s_scanner;
    private boolean test = false;
    MidiManager m;

    static LinkedList<GameObjects> registeredObjects;

    @RequiresApi(api = Build.VERSION_CODES.M)
    public GameView(Context context) {
        super (context);

        getHolder().addCallback(this);

        thread = new MainThread(getHolder(), this);
        setFocusable(true);

        s_scanner = BitmapFactory.decodeResource(context.getResources(), R.drawable.scanner);

        //Initial Object-creation

        registeredObjects = new LinkedList<>();

        scanner = new Scanner(s_scanner, 500, 100);
        registeredObjects.add(scanner);

        instanceCreator = new InstanceCreator(context, 1920, 100);
        registeredObjects.add(instanceCreator);

        m = (MidiManager)context.getSystemService(Context.MIDI_SERVICE);

        line = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.lines), 1920, 491, true);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int screenWidth, int screenHeight) {

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        thread.setRunning(true);
        thread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        while (retry) {
            try {
                thread.setRunning(false);
                thread.join();
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
            retry = false;
            }

        }
    public void step(){
        for (int i = 0; i < registeredObjects.size(); i++) {
            GameObjects tempObj = registeredObjects.get(i);
            tempObj.step();
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        canvas.drawColor(-1);

        canvas.drawBitmap(line, 0, 300, null);
        if (canvas !=null) {
            for (int i = 0; i < registeredObjects.size(); i++) {
                GameObjects tempObj = registeredObjects.get(i);
                tempObj.draw(canvas);
            }
        }

        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setTextSize(100);

        m.registerDeviceCallback(new MidiManager.DeviceCallback() {
            public void onDeviceAdded( MidiDeviceInfo info ) {
                test = true;
            }
            public void onDeviceRemoved( MidiDeviceInfo info ) {
                test = false;
            }
        });
        canvas.drawText("My Text", 100, 100, paint);
    }
}
...