Unity3D Android插件:无法启动服务,意图错误
本文关键字:服务 意图 错误 启动 Android 插件 Unity3D | 更新日期: 2023-09-27 18:04:45
我试图在Unity3d Android插件内启动服务,但无法使其工作。正在开发Android Studio测试应用,但是在unity内部调用失败
My service class
public class ProximityService extends Service {
private String TAG = "iProximity: ";
NotificationManager _NotificationManager;
private Context _Context;
private static Timer _Timer = new Timer();
public ProximityService() {
}
private void sendNotification() {
Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder builder;
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, iRealUnityPlayerActivity.class), 0);
builder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ireal)
.setContentTitle("Notification")
.setContentText("message")
.setTicker("msg: mensaje")
.setSound(sound)
.setAutoCancel(true);
builder.setContentIntent(contentIntent);
_NotificationManager.notify(0, builder.build());
}
@Override
public void onCreate() {
Log.i(TAG, "onCreate()");
super.onCreate();
_Context = getApplicationContext();
_NotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
// methods
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStartCommanf()");
//startProximity();
sendNotification();
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "onBind()");
// TODO: Return the communication channel to the service.
return null;
}
}
用来启动服务的Java类:
public final class StatusCheckStarter {
static Context myContext;
// Called From C# to get the Context Instance
public static void ReceiveContextInstance(Context tempContext) {
myContext = tempContext;
}
public static String StartProximityService()
{
String result = "OK";
try
{
myContext.startService(new Intent(myContext, ProximityService.class));
}
catch (Exception e) {
e.printStackTrace();
result = e.getMessage();
}
return result;
}
public static String Dummy() {
return "DONEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE";
}
}
Unity c#代码,用于调用java函数来启动服务:
AndroidJavaClass unityClass;
AndroidJavaObject unityActivity;
AndroidJavaObject unityContext;
AndroidJavaClass customClass;
string a1 = "";
string a2 = "";
string a3 = "";
string a4 = "";
void Start () {
//Replace with your full package name
sendActivityReference("info.ireal.proximitylib.StatusCheckStarter");
//Now, start service
startService();
Debug.Log ("START");
}
void sendActivityReference(string packageName)
{
unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext");
customClass = new AndroidJavaClass(packageName);
customClass.CallStatic("ReceiveContextInstance", unityContext);
}
void startService()
{
a4 = customClass.CallStatic<string> ("Dummy");
a3 = customClass.CallStatic<string>("StartProximityService");
}
Dummy方法正在工作并返回一个字符串值,但是服务不工作
Adb logcat message:
无法启动服务cmp = info.ireal.proximitytest/info.ireal.proximitylib.ProximityServiceVirtualScreenParam=Params{mDisplayId=-1, null, mFlags=0x00000000)}}U=0: not found
非常感谢您的帮助。
马里亚诺•
我正在使用这个线程的解决方案,但仍然不能使它工作。
编辑我AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
android:installLocation="preferExternal"
android:versionCode="1"
android:versionName="1.0">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"/>
<application
android:theme="@style/UnityThemeSelector"
android:icon="@drawable/app_icon"
android:label="@string/app_name"
android:debuggable="true">
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
<service android:name="info.ireal.proximitylib.ProximityService" />
<!---<service android:name="ProximityService" />-->
</application>
</manifest>
这可能是Manifest。确保在service标记中包含服务类。它可以是下面的任何一个问题。构建,运行和测试每个你尝试。
1。将类添加到Manifest中。
<application
<service android:name=".ProximityService" />
</application>
2 。将具有清单完整路径的类添加到清单。如果这不起作用,请使用完整的服务类包名
<application
<service android:name="info.ireal.proximitylib.ProximityService" />
</application>
3 。从Unity将类添加到Manifest中。
同样,如果失败,转到<UnityInstallationDirecory>'Editor'Data'PlaybackEngines'AndroidPlayer'Apk
将AndroidManifest.xml
从该地方文件复制到您的Assets'Plugins'Android目录,然后在Manifest中包含上面的服务标签代码。保存并运行
。最后,用Activity
代替Context
。
Java端变化:
。重命名static Context myContext;
为static Activity myActivity;
把
public static void ReceiveContextInstance(Context tempContext) {
myContext = tempContext;
}
public static void ReceiveContextInstance(Activity tempActivity) {
myActivity = tempActivity;
}
c#的变化:
C 。将customClass.CallStatic("ReceiveContextInstance", unityContext);
替换为customClass.CallStatic("ReceiveContextInstance", unityActivity);