我正在尝试在Unity3d Android插件中启动服务,但无法使其正常工作。正在使用Android Studio测试应用程序,但服务调用在统一内部失败。
我的服务类
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消息:
无法启动服务Intent { CMP = info.ireal.proximitytest / info.ireal.proximitylib.ProximityService VirtualScreenParam = Params {mDisplayId = -1,null,mFlags = 0x00000000)}} U = 0:未找到
我非常感谢任何帮助,祝你好运
马里亚诺
我正在使用此thread的解决方案,但仍无法使其正常工作。
修改
我的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>
答案 0 :(得分:0)
这可能是清单。确保在服务标记中包含服务类。 可能是以下任何一个问题。构建,运行并测试您尝试的每个。
1 。将类添加到Manifest。
<application
<service android:name=".ProximityService" />
</application>
2 。添加具有Manifest完整路径的类。 如果这不起作用,请使用完整的服务类包名称
<application
<service android:name="info.ireal.proximitylib.ProximityService" />
</application>
3 。将这个类添加到Unity本身的Manifest中。
同样,如果失败,请转到<UnityInstallationDirecory>\Editor\Data\PlaybackEngines\AndroidPlayer\Apk
将AndroidManifest.xml
从该位置文件复制到Assets \ Plugins \ Android目录,然后在Manifest中包含上面的服务标记代码。保存并运行。
4 。最后,使用Activity
代替Context
。
Java端的更改:
A 。重命名static Context myContext;
至static Activity myActivity;
B 。更改
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);