如何使用 cocos2d-x 启动另一个 Android 应用程序?
How to launch another Android app using cocos2d-x?
我正在用 cocos2d-x 为 Android 使用 C++ 制作游戏。现在,我正在寻找一种方法来打开另一个 Android 应用程序(例如 YouTube、Google Play Store,...),通过按钮从我的游戏中使用它们的包名称。我四处搜索,发现它可以在 Java 代码中完成,代码如下:
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) {
startActivity(launchIntent);//null pointer check in case package name was not found
}
我的问题是:是否可以在我的本机代码(.cpp 文件)中打开另一个 Android 应用程序,或者我必须将它们放在 java 端(.java 文件)?如果我必须在 .java 文件中进行,我应该把它放在哪里?我总是在 Visual Studio 中使用 .cpp 文件,在 Android Studio 上使用 cmd 和 运行 模拟器进行编译,我从未使用过 [=] 生成的 .java 文件45=] 在 Android Studio 中,引擎只是为我准备好一切,所以我在这里有点困惑。
更新 1:
Abhishek Aryan 的建议有效,但当我在另一个应用程序中时,我的游戏在恢复时崩溃了。我试图在打开其他应用程序之前执行一些操作,它们可能会导致崩溃,因为如果我删除这些操作并单独保留 openApp
功能,我可以 运行 它没有任何问题。
我的期望: 按下按钮 => 暂停我的游戏并在 Android 上打开 You Tube => 按返回按钮 => 暂停 You Tube 并继续我的游戏.
发生了什么: 我可以打开 You Tube,但当我按下后退按钮时我的应用程序崩溃了。我从 Android Studio 得到以下错误代码:
A/libc: Fatal signal 11 (SIGSEGV) at 0x0004fb18 (code=1), thread 1975 (Thread-55)
知道我该如何解决吗?
我的代码:
auto imageOpeningAction = CallFunc::create([&]() {
mOpeningImage->setEnabled(true);
mOpeningImage->setOpacity(255);
mOpeningImage->setPosition(menuItem->getPosition());
mOpeningImage->runAction(fullScale);
});
auto imageClosingAction = CallFunc::create([&]() {
mOpeningImage->runAction(reverseScale);
mOpeningImage->setOpacity(0);
mOpeningImage->setEnabled(false);
});
auto openAnotherApp = CallFunc::create([&]() { // Open YouTube app
HelloWorld::openApp(packageName);
});
runAction(Sequence::create(imageOpeningAction->clone(), DelayTime::create(0.5f), openAnotherApp->clone(), nullptr));
非常感谢您的关注和帮助。
您需要使用 JNI 来满足您的要求。
创建一个方法来打开您 AppActivity
中的任何应用程序。
public class AppActivity extends Cocos2dxActivity {
private static Activity activity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activity=this;
}
public static void openOtherApp(String packageName){
Intent launchIntent = activity.getPackageManager().getLaunchIntentForPackage(packageName);
if (launchIntent != null) {
activity.startActivity(launchIntent);
}
}
}
完成!
还没有,现在我只需要从 c++ 调用 openOtherApp
方法,所以我在我的 .cpp 文件中创建了一个方法。
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
#endif
void openApp(std::string packageName){
#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
JniMethodInfo methodInfo;
const char* class_name="org/cocos2dx/cpp/AppActivity";
const char* method_name="openOtherApp";
const char* parameter= "(Ljava/lang/String;)V";
if (! cocos2d::JniHelper::getStaticMethodInfo(methodInfo, class_name, method_name ,parameter )) {
return;
}
jstring jStringParam = methodInfo.env->NewStringUTF(packageName.c_str());
methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID,jStringParam);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
#endif
}
想开通facebook通话openApp(com.facebook.katana);
我正在用 cocos2d-x 为 Android 使用 C++ 制作游戏。现在,我正在寻找一种方法来打开另一个 Android 应用程序(例如 YouTube、Google Play Store,...),通过按钮从我的游戏中使用它们的包名称。我四处搜索,发现它可以在 Java 代码中完成,代码如下:
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) {
startActivity(launchIntent);//null pointer check in case package name was not found
}
我的问题是:是否可以在我的本机代码(.cpp 文件)中打开另一个 Android 应用程序,或者我必须将它们放在 java 端(.java 文件)?如果我必须在 .java 文件中进行,我应该把它放在哪里?我总是在 Visual Studio 中使用 .cpp 文件,在 Android Studio 上使用 cmd 和 运行 模拟器进行编译,我从未使用过 [=] 生成的 .java 文件45=] 在 Android Studio 中,引擎只是为我准备好一切,所以我在这里有点困惑。
更新 1:
Abhishek Aryan 的建议有效,但当我在另一个应用程序中时,我的游戏在恢复时崩溃了。我试图在打开其他应用程序之前执行一些操作,它们可能会导致崩溃,因为如果我删除这些操作并单独保留 openApp
功能,我可以 运行 它没有任何问题。
我的期望: 按下按钮 => 暂停我的游戏并在 Android 上打开 You Tube => 按返回按钮 => 暂停 You Tube 并继续我的游戏.
发生了什么: 我可以打开 You Tube,但当我按下后退按钮时我的应用程序崩溃了。我从 Android Studio 得到以下错误代码:
A/libc: Fatal signal 11 (SIGSEGV) at 0x0004fb18 (code=1), thread 1975 (Thread-55)
知道我该如何解决吗?
我的代码:
auto imageOpeningAction = CallFunc::create([&]() {
mOpeningImage->setEnabled(true);
mOpeningImage->setOpacity(255);
mOpeningImage->setPosition(menuItem->getPosition());
mOpeningImage->runAction(fullScale);
});
auto imageClosingAction = CallFunc::create([&]() {
mOpeningImage->runAction(reverseScale);
mOpeningImage->setOpacity(0);
mOpeningImage->setEnabled(false);
});
auto openAnotherApp = CallFunc::create([&]() { // Open YouTube app
HelloWorld::openApp(packageName);
});
runAction(Sequence::create(imageOpeningAction->clone(), DelayTime::create(0.5f), openAnotherApp->clone(), nullptr));
非常感谢您的关注和帮助。
您需要使用 JNI 来满足您的要求。
创建一个方法来打开您 AppActivity
中的任何应用程序。
public class AppActivity extends Cocos2dxActivity {
private static Activity activity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activity=this;
}
public static void openOtherApp(String packageName){
Intent launchIntent = activity.getPackageManager().getLaunchIntentForPackage(packageName);
if (launchIntent != null) {
activity.startActivity(launchIntent);
}
}
}
完成!
还没有,现在我只需要从 c++ 调用 openOtherApp
方法,所以我在我的 .cpp 文件中创建了一个方法。
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
#endif
void openApp(std::string packageName){
#if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
JniMethodInfo methodInfo;
const char* class_name="org/cocos2dx/cpp/AppActivity";
const char* method_name="openOtherApp";
const char* parameter= "(Ljava/lang/String;)V";
if (! cocos2d::JniHelper::getStaticMethodInfo(methodInfo, class_name, method_name ,parameter )) {
return;
}
jstring jStringParam = methodInfo.env->NewStringUTF(packageName.c_str());
methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID,jStringParam);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
#endif
}
想开通facebook通话openApp(com.facebook.katana);