繁体   English   中英

Android工作室项目到Unity 5

[英]Android studio project to Unity 5

我在android studio中做了一个通知服务项目,在棒棒糖上运行完美。 现在我正在尝试将它变成Unity 5的插件。但是一旦构建它就会在启动时不断崩溃......

AndroidManifest.xml中:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.techlab.samanthaplugin" >

<application
    android:allowBackup="true"
    android:label="SamanthaPlugin">
    <activity
        android:name="com.techlab.samanthaplugin.MainActivity"
        android:label="SamanthaPlugin" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:name="com.techlab.samanthaplugin.NotificationService"
             android:label="SamanthaPlugin"
             android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">

    <intent-filter>

        <action android:name="android.service.notification.NotificationListenerService" />

    </intent-filter>

</service>

</application>

NotificationService类:

package com.techlab.samanthaplugin;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;
import android.support.v4.content.LocalBroadcastManager;


public class NotificationService extends NotificationListenerService {

Context context;

@Override

public void onCreate() {

    super.onCreate();
    context = getApplicationContext();

}
@Override

public void onNotificationPosted(StatusBarNotification sbn) {


    String pack = sbn.getPackageName();
    String ticker = sbn.getNotification().tickerText.toString();
    Bundle extras = sbn.getNotification().extras;
    String title = extras.getString("android.title");
    String text = extras.getCharSequence("android.text").toString();

    Log.i("Package",pack);
    Log.i("Ticker",ticker);
    Log.i("Title",title);
    Log.i("Text",text);

    Intent msgrcv = new Intent("Msg");
    msgrcv.putExtra("package", pack);
    msgrcv.putExtra("ticker", ticker);
    msgrcv.putExtra("title", title);
    msgrcv.putExtra("text", text);

    LocalBroadcastManager.getInstance(context).sendBroadcast(msgrcv);


}

@Override

public void onNotificationRemoved(StatusBarNotification sbn) {
    Log.i("Msg","Notification Removed");

}
}

主要活动:

package com.techlab.samanthaplugin;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;


public class MainActivity extends Activity {

//TableLayout tab;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);
    //tab = (TableLayout)findViewById(R.id.tab);
    LocalBroadcastManager.getInstance(this).registerReceiver(onNotice, new IntentFilter("Msg"));

}


private BroadcastReceiver onNotice= new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String pack = intent.getStringExtra("package");
        String title = intent.getStringExtra("title");
        String text = intent.getStringExtra("text");



            //TableRow tr = new TableRow(getApplicationContext());
            //tr.setLayoutParams(new TableRow.LayoutParams( TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
            //TextView textview = new TextView(getApplicationContext());
            //textview.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT,1.0f));
            //textview.setTextSize(20);
            //textview.setTextColor(Color.parseColor("#0B0719"));
            //textview.setText(Html.fromHtml(pack +"<br><b>" + title + " : </b>" + text));
            //tr.addView(textview);
            //tab.addView(tr);
    }
};
}

的build.gradle:

apply plugin: 'com.android.library'

android {
compileSdkVersion 21
buildToolsVersion "21.0.2"

defaultConfig {
    //applicationId "techlab.samanthaplugin"
    minSdkVersion 19
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.android.gms:play-services:6.1.71'
compile files('libs/classes.jar')
}
//task to delete the old jar
task deleteOldJar(type: Delete) {
delete 'release/AndroidPlugin.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
from('build/intermediates/bundles/release/')
into('release/')
include('classes.jar')
///Rename the jar
rename('classes.jar', 'AndroidPlugin.jar')
}

exportJar.dependsOn(deleteOldJar, build)

我似乎无法找到其中哪一个导致崩溃。 :-(

发现了什么是错的,所以我会把它作为答案发布。 将Android Studio应用程序制作成Unity 5插件:

首先,您需要将项目转换为库。 您可以通过将Unity classes.jar复制到app / libs文件夹中来完成此操作。 你可以在pc上找到classes.jar

C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\release\bin

在Mac上

Applications\Unity(rightclick Show Package Content)PlaybackEngines\AndroidPlayer\Variations\Release\Classes

右键单击Android Studio应用程序中的classes.jar,然后选择Add as Library。 将其添加到您的应用中。

从你的app文件夹中打开build.gradle并粘贴它添加它的底部。

//task to delete the old jar
task deleteOldJar(type: Delete) {
    delete 'release/AndroidPlugin.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('release/')
    include('classes.jar')
    ///Rename the jar
    rename('classes.jar', 'AndroidPlugin.jar')
}

exportJar.dependsOn(deleteOldJar, build)

然后同步它。 现在,如果您打开右侧的gradle选项卡并导航“other”任务文件夹以查找exportJar任务。 双击它会在app / release中创建一个AndroidPlugin.jar这个与你的Manifest.xml一起进入统一,在Assets / Plugins / Android中(你创建你需要的文件夹)

为回顾我是从这个

现在对于让我在转换项目时感到困惑的部分。 您总是需要Android Studio项目中的一个扩展UnityPlayerActivity的类。 这是你的团结项目和你的android工作室项目之间的桥梁。

为了能够将更改与上面的代码进行比较,我将重新发布有效的代码(清单和gradle几乎保持相同,MainActivity.java中的重大变化:

所以MainActivity类:

package com.techlab.pluginsamantha;

import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {

    public String GetSenderName()
    {
        String senderName = NotificationService.sender;
        return senderName;
    }
    public String GetAppName()
    {
        String appName = NotificationService.appName;
        return appName;
    }
    public String GetTitle()
    {
        String textTitle = NotificationService.titleText;
        return textTitle;
    }
    public String GetBody()
    {
        String textBody = NotificationService.bodyText;
        return textBody;
    }
    public boolean GetNewNotification()
    {
        return NotificationService.newNotification;
    }
}

NotificationService类:

package com.techlab.pluginsamantha;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;
import android.support.v4.content.LocalBroadcastManager;


public class NotificationService extends NotificationListenerService {

    Context context;
    public static String appName;
    public static String sender;
    public static String titleText;
    public static String bodyText;
    public static boolean newNotification;

    @Override

    public void onCreate() {

        super.onCreate();
        context = getApplicationContext();

    }
    @Override

    public void onNotificationPosted(StatusBarNotification sbn) {

        newNotification = true;
        String pack = sbn.getPackageName();
        appName = pack;
        String ticker = sbn.getNotification().tickerText.toString();
        sender = ticker;
        Bundle extras = sbn.getNotification().extras;
        String title = extras.getString("android.title");
        titleText = title;
        String text = extras.getCharSequence("android.text").toString();
        bodyText = text;

        newNotification = false;

    }

    @Override

    public void onNotificationRemoved(StatusBarNotification sbn) {
        Log.i("Msg","Notification Removed");

    }
}

这是我的PluginController脚本统一:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Runtime.InteropServices;

public class PluginController : MonoBehaviour {

    public GUISkin skin;
    public List<Notification> notifications = new List<Notification>();
    string bodyText = "";

    public string GetSenderName()
    {
        AndroidJavaClass unity = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject> ("currentActivity");
        return currentActivity.Call<string>("GetSenderName");
    }
    public string GetAppName()
    {
        AndroidJavaClass unity = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject> ("currentActivity");
        return currentActivity.Call<string>("GetAppName");
    }

    public string GetTitleText()
    {
        AndroidJavaClass unity = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject> ("currentActivity");
        return currentActivity.Call<string>("GetTitle");
    }
    public string GetBodyText()
    {
        AndroidJavaClass unity = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject> ("currentActivity");
        return currentActivity.Call<string>("GetBody");
    }
    public bool GetNewNotification()
    {
        AndroidJavaClass unity = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject> ("currentActivity");
        return currentActivity.Call<bool>("GetNewNotification");
    }
    void Update()
    {
        if(GetNewNotification())
            CopyNotification();
    }
    public void CopyNotification()
    {
        if(bodyText != GetBodyText())
        {
            Notification note = new Notification();
            note.SenderName = GetSenderName();
            note.AppName = GetAppName();
            note.TitleText = GetTitleText();
            note.TitleLength = note.TitleText.Length;
            note.BodyText = GetBodyText();
            note.BodyLength = note.BodyText.Length;
            notifications.Add(note);
            bodyText = GetBodyText();
        }
    }
    void OnGUI()
    {
        GUI.skin = skin;
        foreach(Notification n in notifications)
        {
            GUILayout.Label("SenderName: "+n.SenderName);
            GUILayout.Label("AppName: "+n.AppName);
            GUILayout.Label("TitleText: "+n.TitleText+" :length: "+n.TitleLength.ToString());
            GUILayout.Label("BodyText: "+n.BodyText+" :length: "+n.BodyLength.ToString());
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM