- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 Unity 创建一个 Android 插件以从 Android 设备获取 WiFi 信息,当我尝试在我的 Android 设备上运行该应用程序时它崩溃了。让我知道我做错了什么或完全错了,欢迎提出所有建议。
目标SDK版本:21运行在 Android 版本 8.0.0
谢谢! Manifest File Location : AndroidProjects\pluginlibrary\src\main
`<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.pluginlibrary" >
<!--dangerous permission-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>`
package com.example.pluginlibrary;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.util.Log;
import android.widget.Toast;
import com.unity3d.player.UnityPlayerActivity;
import java.util.List;
public class PluginTest extends UnityPlayerActivity {
private Context context;
WifiManager wifiManager;
private static PluginTest instance;
public PluginTest() {
this.instance = this;
}
public static PluginTest instance() {
if (instance == null) {
instance = new PluginTest();
}
return instance;
}
public void setContext(Context context) {
this.context = context;
}
public void ShowMessage(String message) {
Toast.makeText(this.context, message, Toast.LENGTH_SHORT).show();
}
public String GetWifiInformation() {
Log.d("Unity", "GetWifiInformation: ");
wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent intent) {
boolean success = intent.getBooleanExtra(
WifiManager.EXTRA_RESULTS_UPDATED, false);
if (success) {
scanSuccess();
} else {
// scan failure handling
scanFailure();
}
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
context.registerReceiver(wifiScanReceiver, intentFilter);
boolean success = wifiManager.startScan();
if (!success) {
// scan failure handling
scanFailure();
}
Log.d("Unity", "Getring return value");
return "";
}
private void scanSuccess() {
List<ScanResult> results = wifiManager.getScanResults();
// get the BSSID from the scan results
}
private void scanFailure() {
// handle failure: new scan did NOT succeed
// consider using old scan results: these are the OLD results!
List<ScanResult> results = wifiManager.getScanResults();
}
public void GetMessageFromUnity() {
Log.d("Unity", "GetMessageFromUnity: ");
}
}
`
Android 插件类续
Android Plugin Class Continued
09-29 13:48:00.339 25438-25455/? A/zygote: java_vm_ext.cc:504] JNI DETECTED ERROR IN APPLICATION: JNI FindClass called with pending exception java.lang.SecurityException: WifiService: Neither user 10140 nor current process has android.permission.CHANGE_WIFI_STATE.
java_vm_ext.cc:504] at void android.os.Parcel.readException(int, java.lang.String) (Parcel.java:1959)
java_vm_ext.cc:504] at void android.os.Parcel.readException() (Parcel.java:1905)
java_vm_ext.cc:504] at void android.net.wifi.IWifiManager$Stub$Proxy.startScan(android.net.wifi.ScanSettings, android.os.WorkSource, java.lang.String) (IWifiManager.java:1607)
java_vm_ext.cc:504] at boolean android.net.wifi.WifiManager.startScan(android.os.WorkSource) (WifiManager.java:1838)
java_vm_ext.cc:504] at boolean android.net.wifi.WifiManager.startScan() (WifiManager.java:1829)
java_vm_ext.cc:504] at java.lang.String com.example.pluginlibrary.PluginTest.GetWifiInformation() (PluginTest.java:84)
java_vm_ext.cc:504] at boolean com.unity3d.player.UnityPlayer.nativeRender() ((null):-2)
java_vm_ext.cc:504] at boolean com.unity3d.player.UnityPlayer.c(com.unity3d.player.UnityPlayer) ((null):-1)
java_vm_ext.cc:504] at boolean com.unity3d.player.UnityPlayer$e$2.queueIdle() ((null):-1)
java_vm_ext.cc:504] at android.os.Message android.os.MessageQueue.next() (MessageQueue.java:394)
java_vm_ext.cc:504] at void android.os.Looper.loop() (Looper.java:142)
java_vm_ext.cc:504] at void com.unity3d.player.UnityPlayer$e.run() ((null):-1)
java_vm_ext.cc:504]
java_vm_ext.cc:504] in call to FindClass
java_vm_ext.cc:504] from boolean com.unity3d.player.UnityPlayer.nativeRender()
java_vm_ext.cc:504] "UnityMain" prio=5 tid=13 Runnable
java_vm_ext.cc:504] | group="main" sCount=0 dsCount=0 flags=0 obj=0x181c05f8 self=0xdd87ea00
java_vm_ext.cc:504] | sysTid=25455 nice=0 cgrp=default sched=0/0 handle=0xcffff970
java_vm_ext.cc:504] | state=R schedstat=( 692579348 31631464 1032 ) utm=53 stm=16 core=6 HZ=100
java_vm_ext.cc:504] | stack=0xcfefd000-0xcfeff000 stackSize=1038KB
java_vm_ext.cc:504] | held mutexes= "mutator lock"(shared held)
java_vm_ext.cc:504] native: #00 pc 002c4afb /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+130)
java_vm_ext.cc:504] native: #01 pc 003565a1 /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMapb+200)
java_vm_ext.cc:504] native: #02 pc 00352a73 /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMapb+34)
java_vm_ext.cc:504] native: #03 pc 0022fff5 /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+736)
java_vm_ext.cc:504] native: #04 pc 002303eb /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortVEPKcS2_St9__va_list+58)
java_vm_ext.cc:504] native: #05 pc 000d286f /system/lib/libart.so (_ZN3art11ScopedCheck6AbortFEPKcz+46)
java_vm_ext.cc:504] native: #06 pc 000d2407 /system/lib/libart.so (_ZN3art11ScopedCheck11CheckThreadEP7_JNIEnv+354)
java_vm_ext.cc:504] native: #07 pc 000d0c05 /system/lib/libart.so (_ZN3art11ScopedCheck5CheckERNS_18ScopedObjectAccessEbPKcPNS_12JniValueTypeE+604)
java_vm_ext.cc:504] native: #08 pc 000bd8f7 /system/lib/libart.so (_ZN3art8CheckJNI9FindClassEP7_JNIEnvPKc+450)
java_vm_ext.cc:504] native: #09 pc 00452378 /data/app/com.CJ.AndroidPLugin-BqvsV8_-skC366qUka3LQA==/lib/arm/libunity.so (???)
java_vm_ext.cc:504] native: #10 pc 00442108 /data/app/com.CJ.AndroidPLugin-BqvsV8_-skC366qUka3LQA==/lib/arm/libunity.so (???)
java_vm_ext.cc:504] native: #11 pc 0000296b /data/app/com.CJ.AndroidPLugin-BqvsV8_-skC366qUka3LQA==/oat/arm/base.odex (Java_com_unity3d_player_UnityPlayer_nativeRender__+74)
java_vm_ext.cc:504] at com.unity3d.player.UnityPlayer.nativeRender(Native method)
java_vm_ext.cc:504] at com.unity3d.player.UnityPlayer.c(unavailable:-1)
java_vm_ext.cc:504] at com.unity3d.player.UnityPlayer$e$2.queueIdle(unavailable:-1)
java_vm_ext.cc:504] at android.os.MessageQueue.next(MessageQueue.java:394)
java_vm_ext.cc:504] at android.os.Looper.loop(Looper.java:142)
java_vm_ext.cc:504] at com.unity3d.player.UnityPlayer$e.run(unavailable:-1)
java_vm_ext.cc:504]
public class PluginWrapper : MonoBehaviour {
private AndroidJavaObject androidInstance = null;
private AndroidJavaObject activityContext = null;
// Use this for initialization
void Start()
{
if (androidInstance == null)
{
using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
}
using (AndroidJavaObject pluginClass = new AndroidJavaObject("com.example.pluginlibrary.PluginTest"))
{
if (pluginClass != null)
{
androidInstance = pluginClass.CallStatic<AndroidJavaObject>("instance");
androidInstance.Call("setContext", activityContext);
androidInstance.Call("GetMessageFromUnity");
androidInstance.Call<string>("GetWifiInformation");
activityContext.Call("runOnUiThread", new AndroidJavaRunnable(() =>
{
androidInstance.Call("ShowMessage", "Plugin Active!");
}));
}
}
}
//androidJavaClass = new AndroidJavaObject("com.example.pluginlibrary.PluginTest");
//androidJavaClass.Call("GetMessageFromUnity");
}
`
最佳答案
这是错误的第一行也是最重要的部分:
A/zygote: java_vm_ext.cc:504] JNI DETECTED ERROR IN APPLICATION: JNI FindClass called with pending exception java.lang.SecurityException: WifiService: Neither user 10140 nor current process has android.permission.CHANGE_WIFI_STATE.
您必须复制 AndroidManifest.xml
将具有权限的文件添加到您的 Unity 项目中。那应该放在 <UnityProjectName>Assets\Plugins\Android
中.如果您仍然得到上面的确切异常,则意味着您没有正确完成此操作。您必须正确拼写文件夹名称。
关于android - java.lang.SecurityExcption : WifiService: Neither usr 10140 nor curent proces hs andrid. prmission.CHANGE_WIFI_STATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52572074/
阅读Yesod的源代码中,我遇到过带有“.hsfiles”扩展名的文件。示例:mongo.hsfiles 。它们是什么,为什么创建它们以及为什么使用它们? 最佳答案 您可以看到here相关代码: ba
我在关注 stack guide我得到了一个新的项目设置(耶!)。 它生成了以下文件布局: . ├── app │ ├── Main.hs ├── .gitignore ├── LICENSE ├
我在我的项目中创建了一个类(javahelp),用于在单击帮助内容(菜单项)时获取java帮助文件。我更新了目录中安装的 javahelp-2.0_05 C:\Program Files\javahe
我有一个巨大的 haskell 文件,可以毫无问题地编译和运行。我想将一些函数和类型定义放在通用 hs 文件中的单独模块中,然后将其导入我的主模块中。虽然主程序编译没有任何错误(它也编译导入的模块),
我正在阅读 Parallel and Concurrent Programming in Haskell 的第 11 章.在那本书中,以下 program用于同时获取 URL: main = do
我一直在尝试在我的 Haskell 项目中使用glpk-hs,但我完全不知道如何去做。我正在使用 stack 来运行我的程序,我的困惑很可能来自于我对其工作原理缺乏了解。 话虽这么说,我已经下载了gl
我遵循此处的指示: https://haskell.fpcomplete.com/tutorial/stack-script 我有一个具有以下文件结构的 cabal/stack 项目: app/Mai
我在基于 arch 的系统之上使用 xmonad。但是升级后我无法通过编译我的 xmonad.hs 文件 $ xmonad --recompile 我似乎在 xmonad 的每个模块上都出错,甚至 i
encoding包使用 HaXml在其构建脚本中(在 Setup.hs 中)。它碰巧使用了在 HaXml-1.19 和 HaXml-1.22 之间更改的接口(interface)位。如果编码包能够使用
我正在使用 Notepad++ 和 WinGHCi 做一些功课,我必须定义一个小“数据库”。格式是任意的,我认为这不是我要去的地方。无论如何,这是我在 *.hs 文件中使用的内容: let stude
我的项目结构如下: ~/.../project_name project_name.cabal Setup.hs src/ Main.hs Data/ ... test
我需要找出在 Setup.hs 中构建的标志(在 cabal 文件中找到的类型)。我想我正在寻找类型为 FlagAssignment 的东西。我怎样才能得到这个? 最佳答案 idris 必须这样做,y
我将 stack.exe v0.1.2.2 放入我的 PATH 目录之一,然后通过 stack setup 安装 ghc-7.8.4。 我尝试安装 ghc-mod 并获得奇怪的错误 Setup.hs:
我正在尝试比较两个不同的目录,其中有很多目录 du -hs User/data/dbs/* home/common/dbs/* 结果是两个目录依次显示出来。 12gb User/data/dbs/fi
我得到了一个 Setup.hs 文件,以及另一个包含源代码的 .hs 文件。每当我尝试通过以下方式配置安装时: runhaskell Setup.hs configure 我得到错误: Setup:
我制作了一个名为time.hs的文件。它包含一个测量另一个函数执行时间的函数。 有没有办法将time.hs文件导入到另一个Haskell脚本中? 我想要这样的东西: module Main where
我试图从 ~/.xmonad/Tree.hs 导入一个名为“Tree.hs”的自定义本地模块,但我得到: Error detected while loading xmonad configurati
组合在 Haskell 中是很正常的,但我只知道我可以定义组合函数的特殊行为,说 Prelude> (floor . sqrt) (10^55) 316227766016837936511293849
我目前正在完成我的第一个 Haskell 项目,在工作的最后一步,在连接不同的 Haskell 文件后,我的 I/O 函数似乎表现得很奇怪。 我有一个主文件(f1.hs),它加载多媒体库的一些信息并将
我正在使用山狮。我打开终端,然后加载 ghci , 我写 :l然后我尝试通过用鼠标将文件从我的桌面拖动到终端来加载我的文件(在我的桌面上),所以我知道位置是正确的,我明白了,提前谢谢你: Prelud
我是一名优秀的程序员,十分优秀!