在Libgdx中使用Android Intent和startActivity(非Activity或AndroidApplication类)

3
请帮忙解释如何在Libgdx线程中运行以下代码 - 在render(),create()等函数中...
public class MyGame implements ApplicationListener, InputProcessor {
...
Intent discoverableIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
.....
Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(
"http://market.android.com/details?id=" + getPackageName()));
startActivity(marketIntent);

代码存在编译错误。 我在谷歌上搜索了一些类似的帖子,但没有精确的“startActivity”代码示例。 谢谢。

在IntelliJ中,“startActivity”单词是红色的。如果编译“extends Activity或AndroidApplication”类,则一切正常。 - nms
无法解决方法“startActivity”。编译对于“extends Activity或AndroidApplication”类来说是可以的。 - nms
2个回答

16

LibGDX是一个跨平台的库,因此使用LibGDX平台中性API的代码本身必须是跨平台的(不能使用Android或Windows等调用)。要访问特定于平台的功能,标准方法是定义接口,并从您的平台中性代码中使用该接口。然后,在应用程序的Android(或Desktop)特定项目中创建接口实现,并在初始化libGDX组件时传递该实现。

此教程有更多细节:http://code.google.com/p/libgdx-users/wiki/IntegratingAndroidNativeUiElements3TierProjectSetup

这里是同样方法的另一个描述(写得更好,但示例与您的要求不太相关):https://github.com/libgdx/libgdx/wiki/Interfacing-with-platform-specific-code

教程旨在访问Android本机UI元素,但基本思想与您的需求相同。


谢谢。我在我的代码中添加了第二个示例。但是如何运行示例的方法“submitScore”?它应该是静态的才能从Libgdx线程中运行。但是我在这个方法中有“startActivity”,如果将“submitScore”更改为静态,则会出现编译错误。 - nms
在第一个例子中,我不理解名称中否定符号“!”的含义。例如,“import android.app.!AlertDialog;”或类名“!ActionResolverAndroid”。它会导致编译错误。 - nms
我将第一个示例添加到我的项目中。我遇到了编译错误,指出ActionResolverAndroid类应该是抽象的。如果我将其改为抽象类,那么在Activity的“actionResolver = new ActionResolverAndroid(this);”行会出现错误。陷入僵局。 - nms
我找到了另一个教程:http://tortillacode.wordpress.com/2011/08/03/launch-android-intents-from-within-libgdx/ 但它也不起作用。不清楚应该将示例代码添加到哪个文件中。 - nms
我能运行第二个例子。但是我遇到了编译错误:javac: 无效的标志: Leaderboard 文件路径。我又创建了项目,但仍然出现相同的标志错误。我尝试按以下方式运行我的方法:AndroidLeaderboard androidLeaderboard = new AndroidLeaderboard(); androidLeaderboard.submitScore("aaa",0); - nms
显示剩余2条评论

3
您之所以出现错误,是因为startActivity()是在Activity类中的一个方法。
要使用此方法,您的类必须满足以下要求:
  1. 扩展Activity或扩展Activity的类
  2. 在某个地方拥有一个Activity实例,可能通过构造函数传递
在第二种情况下,您将拥有以下内容:
public class MyNonActivity {
    Context mContext;
    public MyNonActivity(Context context) {
        mContext = context;
    }

    public void myMethod() {
        Intent intent = new Intent(mContext, Next.class);
        mContext.startActivity(intent);
    }
}

如果要从一个继承了Context或其子类的ActivityService或其他类中调用您的类:

MyNonActivity foo = new MyNonActivity(getBaseContext());

请确保在onCreate()方法中或之后执行以上操作。


我明白startActivity()是Activity类中的一个方法。无论如何运行startActivity() - 这是一个问题。 - nms
很不幸,在MyNonActivity()的“startActivity”行会出现错误。如何在“Next”类中运行方法?我之前尝试过类似的东西。在非活动类中无法获取上下文,但在主活动中可能可以。但也许这是错误的方式。我得到了“looper prepare error”。我不知道该如何解决它。我尝试使用接口来实现上述提到的3个示例。 - nms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接