PackageManager 说设备没有 FEATURE_MIDI

Posted

技术标签:

【中文标题】PackageManager 说设备没有 FEATURE_MIDI【英文标题】:PackageManager says device doesn't have FEATURE_MIDI 【发布时间】:2018-02-04 15:52:52 【问题描述】:

如何编写 android 应用程序来接收来自 Yamaha YDP-113 电子钢琴的 MIDI 事件?

当我强制它时,我得到一个运行时错误:

FATAL EXCEPTION: main
Process: com.example.android.miditest, PID: 19022
java.lang.NoClassDefFoundError: android.media.midi.MidiManager

hasSystemFeature() 方法返回 false:

    if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI)) 
        // do MIDI stuff
        Log.d("MainActivity-onCreate", "has MIDI feature");

        TextView info = (TextView) findViewById(R.id.info_text_view);
        info.setText("MIDI found!");

        MidiManager m = (MidiManager) getSystemService(Context.MIDI_SERVICE);
    
    else 
        Log.d("MainActivity-onCreate", "cannot find MIDI feature");

        TextView info = (TextView) findViewById(R.id.info_text_view);
        info.setText("Sorry, no MIDI");
    

这是我的清单:

<uses-feature android:name="android.software.midi" android:required="true"/>
<uses-feature android:name="android.hardware.usb.host"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

我相信这一定是可能的,因为我安装了 AppsTransport 的“USB Midi Keyboard”,它在 Google Play Store 上有 100,000 次下载。当我在 Yamaha YDP-113 上弹奏音符时,该应用程序会显示我按下的钢琴键盘琴键,甚至发出声音!

其他开发人员正在使用什么来开发与我的键盘、MIDI-USB 电缆和三星平板电脑配合使用的应用程序?我需要在手机上安装什么吗?或者我需要告诉 gradle 一些包或下载?

【问题讨论】:

您是否在AndroidManifest.xml 中声明了该功能? 是的。似乎 Android Studio 3.0 正在编译我的代码,但出现运行时错误:java.lang.NoClassDefFoundError: android.media.midi.MidiManager 【参考方案1】:

MidiManager 仅适用于 Android 6+。 类和相关功能在以前的版本中不存在,因此如果您在旧设备上运行应用程序会出错。

如果您想支持比 Android 6 更早的设备,您将不得不使用某种专有的 SDK 或第三方库。

快速网络搜索表明kshoji/USB-MIDI-Driver 可能会对您有所帮助。

请注意,如果您指定

<uses-feature android:name="android.software.midi" android:required="true"/>

对于不支持 MIDI API 的旧设备,该应用不会出现在 Play 商店中。

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

您可能想删除该行。

【讨论】:

谢谢!现在,如何安装 Shoji 先生的 USB-MIDI 驱动程序? 你不安装它。这是您添加到项目中的库。在此处阅读图书馆维基:github.com/kshoji/USB-MIDI-Driver/wiki/… 谢谢,但我以前从未向项目中添加过库。我只用了几个月的 Android Studio。 @EdPoor 好吧,开始谷歌搜索。如何声明依赖项超出了范围。阅读我之前评论中链接的 wiki 页面,它提到了如何包含这个确切的库的几个选项。选择与您的搜索结果一致的那个。提示:用于 gradle。 谢谢,欧根。你让我朝着正确的方向开始。

以上是关于PackageManager 说设备没有 FEATURE_MIDI的主要内容,如果未能解决你的问题,请参考以下文章

如何在android源码中找到PackageManager类的具体实现

检查android设备是不是支持某些功能

AttributeError:“int”对象没有属性“feat”

PackageManager#installPackage 不适用于 Android N

Android:PackageManager.getSystemAvailableFeatures() 在 Nexus9 上没有按预期工作

使用 PackageManager 获取包名称 [重复]