我正在创建一个可以生成实时乐器声音的应用程序,我正计划使用Android Marshmallow(6.0版)中的新Midi API.我在这里阅读了软件包概述文档http://developer.android.com/reference/android/media/midi/package-summary.html,我知道如何生成Midi笔记,但我仍然不确定:我该怎么做在我生成他们的Midi数据后实际播放这些音符?
我需要合成器程序才能播放Midi音符吗?如果是这样,我是否必须自己制作或者是由Android或第三方提供的?
我是Midi的新手所以请尽量用你的答案描述.
到目前为止 我尝试过:我创建了一个Midi管理器对象并打开了一个输入端口
MidiManager m = (MidiManager)context.getSystemService(Context.MIDI_SERVICE);
MidiInputPort inputPort = device.openInputPort(index);
Run Code Online (Sandbox Code Playgroud)
然后,我已经向端口发送了测试noteOn midi消息
byte[] buffer = new byte[32];
int numBytes = 0;
int channel = 3; // MIDI channels 1-16 are encoded as 0-15.
buffer[numBytes++] = (byte)(0x90 + (channel - 1)); // note on
buffer[numBytes++] = (byte)60; // pitch is middle C
buffer[numBytes++] = (byte)127; // max velocity
int offset = 0;
// post is non-blocking
inputPort.send(buffer, offset, numBytes);
Run Code Online (Sandbox Code Playgroud)
我还设置了一个课程来接收midi音符信息
class MyReceiver …Run Code Online (Sandbox Code Playgroud) 我正在使用流行的billthefarmer驱动程序包创建一个Android midi应用程序.随着马库斯Kauppinen在帮助这个线程我能够让我的应用程序生成和控制MIDI事件(注意,暂停等)的成功.
正如你们中的一些人可能知道的那样,Sonivox EAS Android库附带的默认GM1乐器听起来并不是最好的.对于我的应用程序,我希望能够将自定义乐器加载到合成器中,例如萨克斯管的特定模型.
我从5年前发现了这个问题,询问如何做同样的事情.该问题的答案建议在EAS.h库中使用EAS_LoadDLSCollection()方法.不幸的是,程序员只能找到一种方法将自定义DLS文件加载到库中,而不是实际生成可播放乐器的soundfont(错误的术语?),可以播放哪些音符.
任何人都可以通过它的原生Sonivox EAS Midi库了解如何在Android中加载和使用自定义乐器吗?
我正在尝试在我的应用中的视图上的一个线性布局上设置手势检测.问题是我的应用程序崩溃,每当我用一个手势进行测试时.我收到的错误消息是臭名昭着的"尝试在空对象引用上调用虚方法".我已经完成了研究,我知道问题源于试图调用一个没有正确传递到一个代码中必要范围的Activity上的方法.话虽这么说,我不明白如何在我的代码中解决这个问题.以下是相关的代码:
Playfrets.java
public class PlayFrets extends Activity {
LinearLayout gestureOverlay;
GestureListener gestureListener;
public void configGestureRecognition(){ //Toolbar gesture recognition
gestureOverlay = (LinearLayout) findViewById(R.id.toolbarGestureOverlay);
gestureListener = new GestureListener(PlayFrets.this);
if (gestureOverlay == null){
Toast.makeText(PlayFrets.this, "gestureOverlay object is null bro" ,Toast.LENGTH_SHORT).show();
}
gestureOverlay.setOnTouchListener(gestureListener);
}
}
Run Code Online (Sandbox Code Playgroud)
LoadNoteFiles.java
public class LoadNoteFiles extends AsyncTask<Void, Void, Void>{
private Context mContext;
Activity instance;
public LoadNoteFiles(Context context){ //constructor
mContext = context;
}
@Override
protected void onPreExecute(){
PlayFrets.viewSwitch = new ViewSwitcher(mContext);
PlayFrets.viewSwitch.addView(ViewSwitcher.inflate(mContext, R.layout.splash_screen, null));
instance = (Activity)mContext; //cast context from main …Run Code Online (Sandbox Code Playgroud) 当RecylerView项目被longClicked时,我正试图为一个简单的PopupMenu膨胀重命名/删除选项.出于某种原因,我mPopup.show()在将xml文件加载到inflater后调用时出现XML膨胀错误.
我在我的应用程序的其他地方使用类似的逻辑来制作PopupMenu并且它工作正常.我甚至尝试从应用程序的一个不相关的部分加载工作的PopupMenu到这个inflater我看到android.view.InflateException: Binary XML file line #17: Failed to resolve attribute at index 1logcat中的相同错误,所以也许XML文件不是问题?
如何让这个PopupMenu充气并展示自己?
致命异常Logcat
05-31 23:02:27.421 19597-20019/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.foo, PID: 19597
android.view.InflateException: Binary XML file line #17: Failed to resolve attribute at index 1: TypedValue{t=0x2/d=0x7f01005d a=-1}
Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 1: TypedValue{t=0x2/d=0x7f01005d a=-1}
at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:761)
at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:7060)
at android.view.ViewGroup$MarginLayoutParams.<init>(ViewGroup.java:7241)
at android.widget.FrameLayout$LayoutParams.<init>(FrameLayout.java:438)
at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:370)
at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:369)
at android.view.LayoutInflater.inflate(LayoutInflater.java:505)
at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
at android.support.v7.view.menu.MenuAdapter.getView(MenuAdapter.java:93)
at android.support.v7.view.menu.MenuPopup.measureIndividualMenuWidth(MenuPopup.java:160)
at android.support.v7.view.menu.StandardMenuPopup.tryShow(StandardMenuPopup.java:153) …Run Code Online (Sandbox Code Playgroud) 我只是想在我的 Vue 3 应用程序中做一些基本的 html 动画,但 Animate.css 示例不起作用。
具体来说,使用npm install animate.css --save示例动画代码安装 animate css 依赖项后<h1 class="animate__animated animate__bounce">An animated element</h1>,在加载页面时不会出现动画。标题已渲染,但只是坐在那里,一动不动。
我尝试过其他解决方案,例如更改 Windows 性能、添加animated类等,但没有成功。
我看到一些解决方案使用 CDN 来链接库,但我认为我不必这样做,因为我使用 npm 来安装它。
我究竟做错了什么?
<template>
<div class="container-fluid" id="app">
<h1 class="animate__animated animate__bounce" style="color:white">An animated element</h1>
</div>
</template>
Run Code Online (Sandbox Code Playgroud) 更新:添加了包含蓝牙权限逻辑的主活动代码
我尝试利用 Android 的CompanionDeviceManager API在运行 Android 13 的 Pixel 5 上查找附近的蓝牙(非 LE)设备,但它似乎只能找到附近的 WiFi 网络。我怀疑它deviceFilter无法正常工作。
最初,我的配置代码BluetoothDeviceFilter如下所示:
private val deviceFilter: BluetoothDeviceFilter = BluetoothDeviceFilter.Builder()
// Match only Bluetooth devices whose name matches the pattern
.setNamePattern(Pattern.compile("(?i)\\b(Certain Device Name)\\b"))
.build()
private val pairingRequest: AssociationRequest = AssociationRequest.Builder()
// Find only devices that match our request filter
.addDeviceFilter(deviceFilter)
// Don't stop scanning as soon as one device matching the filter is found.
.setSingleDevice(false)
.build()
Run Code Online (Sandbox Code Playgroud)
然而,使用此代码,系统生成的“配套设备配对”屏幕中不会出现任何设备。旋转器旋转直至超时
考虑到我的正则表达式可能无意中过于严格,我将过滤器更改为使用允许一切的正则表达式,如下所示:
.setNamePattern(Pattern.compile(".*"))
但即使这个过滤器也无法允许任何附近的蓝牙设备出现在配对屏幕中。 …
android bluetooth bluetooth-lowenergy android-bluetooth android-companion-device
由于某种原因,我的搜索栏很小。我希望我的搜索栏的长度至少占据其父视图长度的一半。以下是我的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SeekBar
android:rotation="270"
android:id="@+id/volumeBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10px"
android:layout_gravity="center" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
将layout_height更改为设置值(例如70dp)似乎无法解决问题。如何通过xml处理此搜索栏的长度?
我试图在我的单元测试中调用 Fragment 类中的方法,但我不断收到错误消息 java.lang.ClassCastException: androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity cannot be cast to com.nu.rms.inspections.ui.activity.InspectionActivity
我正在关注 Google 的文档。我很困惑为什么空片段活动有一个演员试图成为我的检查活动(片段所在的父活动),也许这是预期的?
我可以做些什么来缓解 CastClassException 并在我的单元测试中使用我的片段方法?(相关问题不能解决我的问题)
测试
@RunWith(AndroidJUnit4::class)
class ExampleUnitTest {
@Test
fun `inspection failure point to location mapping is correct`() {
val scenario = launchFragment<ContentFragment>()
scenario.onFragment { fragment ->
//TODO: test logic
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
片段类
import androidx.fragment.app.Fragment
...
class ContentFragment : Fragment() {...}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
java.lang.ClassCastException: androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity cannot be cast to com.nu.rms.inspections.ui.activity.InspectionActivity
at com.nu.rms.inspections.ui.fragment.ContentFragment.clearRFIDCache(ContentFragment.kt:565)
at com.nu.rms.inspections.ui.fragment.ContentFragment.showStep1(ContentFragment.kt:222)
at com.nu.rms.inspections.ui.fragment.ContentFragment.access$showStep1(ContentFragment.kt:37)
at com.nu.rms.inspections.ui.fragment.ContentFragment$onViewCreated$1.onChanged(ContentFragment.kt:77)
at com.nu.rms.inspections.ui.fragment.ContentFragment$onViewCreated$1.onChanged(ContentFragment.kt:37)
at androidx.lifecycle.LiveData.considerNotify(LiveData.java:113) …Run Code Online (Sandbox Code Playgroud) testing android unit-testing android-fragments android-fragmentactivity
我用于保存用户登录数据的 ViewModel 遇到问题。
用户登录后,我使用片段 A 中的用户数据更新此 ViewModel,但是当我尝试访问片段 B 中的数据时,我刚刚设置的数据字段始终为空。
当片段 B 初始化时,userLiveData 字段最初不会被观察到,但是,当我user从片段 B 触发对对象的更改时,会在片段 B 中正确观察到更改。看来我的 ViewModel 中字段的先前值永远不会到达片段B,但是新的价值观可以。
为了进行完整性检查,我创建了一个简单的字符串变量(甚至不是 LiveData 对象),将其设置为片段 A 中的值,然后,在导航到片段 BI 后打印该值:它每次都未初始化。就好像我注入到片段 B 中的 ViewModel 与我注入到片段 A 中的 ViewModel 完全分开。
我缺少什么导致片段 B 中的 ViewModel 观察最初不使用user片段 A 中设置的最后一个已知值触发?
片段A
class FragmentA : Fragment() {
private val viewModel: LoginViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.user.observe(this, {
it?.let {
//Called successfully every time
navigateToFragmentB()
}
})
val mockUserData = User() …Run Code Online (Sandbox Code Playgroud) android mvvm android-fragments android-livedata android-viewmodel
当我尝试在MainActivity中初始化一个监听器时,我得到一个编译器错误无法解析方法findPreferenceOnSharedPreferencesChanged.根据这里的答案:
应该从实现PreferenceActivity接口的类中调用findPreference()
但我不明白这样做的代码是什么.如何摆脱编译器错误并成功设置侦听器以进行首选项更改?
MainActivity.java
public class MainActivity extends FragmentActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
private SharedPreferences.OnSharedPreferenceChangeListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
//Test preference menu
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals("pref_wood")) {
Preference woodPref = findPreference(key); //COMPILER ERROR HERE
MainActivity.getGLSurfaceView().setTexture("");
// Set summary to be the user-description for the selected value
woodPref.setSummary(sharedPreferences.getString(key, ""));
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)