android - 如何动态获取 Cordova 插件中的包名?

标签 android cordova

我开发了一个 Cordova 插件,可以打开一个包含 Twitter 搜索时间轴的新 View 。以下是构建它的类:

package com.example.hello;

import com.twitter.sdk.android.tweetui.TweetTimelineListAdapter;
import com.twitter.sdk.android.tweetui.SearchTimeline;
import android.os.Bundle;
import android.app.ListActivity;

public class TimelineListActivity extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Bundle recdData = getIntent().getExtras();
        String hashtag = recdData.getString("hashtag");

        super.onCreate(savedInstanceState);
        setContentView(R.layout.timeline);

        SearchTimeline searchTimeline = new SearchTimeline.Builder().query(hashtag).build();
        final TweetTimelineListAdapter adapter = new TweetTimelineListAdapter(this, searchTimeline);
        setListAdapter(adapter);
    }
}

由于找不到 R 包,我在编译项目时遇到了一些困难。我找到的唯一解决方案是让我的类位于 MainActivity.java 文件附近并与 MainActivity 在同一个包中,因此:

package com.example.hello;

我还在 plugin.xml 中添加了一行,以便在构建项目时将我的 TimelineListActivity.java 放在与 MainActivity.java 相同的文件夹中:

<source-file src="src/android/TimelineListActivity.java" target-dir="src/com/example/hello" />

它是这样工作的,但是有一个问题。由于这是一个插件,我想将它添加到其他 Cordova 项目中,但我不知道它们的包名。 MainActivity.java文件是在将android平台添加到Cordova项目时生成的。有没有办法动态获取包名?或者是否有更好的方法来实现我的结构?

最佳答案

我最初的问题一开始可能很愚蠢,但这是解决方案:

我去掉了R包的使用,从而消除了项目的依赖,不再需要知道项目的包名。 我从调用方方法获取资源 ID(因为类扩展 CordovaPlugin 对我来说很方便)。

private void showTimeline(final String query, final Activity activity, final CallbackContext callbackContext) {
    try {
        Context context = cordova.getActivity().getApplicationContext();
        Intent intent = new Intent(context, Class.forName("com.manifestwebdesign.twitterconnect.TimelineListActivity"));
        intent.putExtra("query", query);
        int resourceId = cordova.getActivity().getResources().getIdentifier("timeline", "layout", cordova.getActivity().getPackageName());
        intent.putExtra("resourceid", resourceId);
        cordova.startActivityForResult(this, intent, 1);
        callbackContext.success();
    }
    catch(Exception e) {
        System.err.println("Exception: " + e.getMessage());
        callbackContext.error(e.getMessage());
    }

}

通过 Intent 传递它,因此避免使用 R。

public class TimelineListActivity extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        Bundle recdData = getIntent().getExtras();
        String query = recdData.getString("query");
        int resourceId = recdData.getInt("resourceid");

        super.onCreate(savedInstanceState);
        setContentView(resourceId);

        SearchTimeline searchTimeline = new SearchTimeline.Builder().query(query).build();
        final TweetTimelineListAdapter adapter = new TweetTimelineListAdapter(this, searchTimeline);
        setListAdapter(adapter);
    }
}

关于android - 如何动态获取 Cordova 插件中的包名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45665240/

相关文章:

java - 从非静态上下文调用静态方法

android - 在android中以编程方式部分关闭屏幕

android - 无法接受许可协议(protocol) Android SDK Platform 24

cordova - 以编程方式重新启动我的Phonegap应用

android - 如何知道安卓手机要休眠了?

android - 更改设置 Android 后重新加载或重新创建旧 Activity

缓存目录 : Failed to find configured root that contains 的 Android FileProvider

javascript - Cordova - 读取大图像会损坏图像

ios - Phonegap native 选择

android - Cordova session cookie 不适用于 Android Lollipop