小编Ell*_*ite的帖子

开发Native Plugin时`GeneratedPluginRegistrant.class`的目的和用法

我目前正在构建一个插件来利用 Android 和 iOS 上的原生 API。

我已经写MyPlugin了实现MethodCallHandler. 在我的插件项目中,我有一个示例应用程序。这个示例应用程序有一个生成的类GeneratedPluginRegistrant.class,它调用静态方法registerWith。所有这些都用作MainActivity.

我有几个问题。

  1. 似乎MyPlugin必须匹配插件项目的名称。IE - 项目是flutter_tools,我的插件必须命名FlutterToolsPlugin,否则GeneratedPluginRegistrant会中断。是如何GeneratedPluginRegistrant产生的?

  2. 的目的是GeneratedPluginRegistrant什么?

  3. 我的插件注册后实际发生了什么?

  4. 如果我想使用MyPlugin,可以不用GeneratedPluginRegistrant吗?我想,以生命周期方法等回答onActivityResult,似乎这种封装使我不能直接在插件进行交互FlutterActivity

  5. 我可以在本机端与我自己的其他本机插件交互而无需通过 Dart 来回切换吗?

android dart flutter

11
推荐指数
1
解决办法
7285
查看次数

Activity 中 OnBackPressedCallback 的默认行为?

我想在我的应用程序中实现导航组件中详细介绍的OnBackPressedCallback。该文档非常清楚地说明了如何在片段中添加此自定义行为,并且效果很好。阅读链接的文档后,它指出您应该避免onBackPressed在活动中覆盖。我当前的onBackPressed方法看起来像这样:

@Override
public void onBackPressed() {

    if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
      drawerLayout.closeDrawer(GravityCompat.START);
    } else if (shouldOverrideBackPressed()) {
      navigationController.popBackStack(R.id.main_fragment, false);
    } else {
      super.onBackPressed();
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一行super.onBackPressed();是我不太清楚的。如何在实现时保留活动中后退按钮的默认行为OnBackPressedCallback?这是我当前的实现:

getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
  @Override
  public void handleOnBackPressed() {
    if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
      drawerLayout.closeDrawer(GravityCompat.START);
    } else if (shouldOverrideBackPressed()) {
      navigationController.popBackStack(R.id.main_fragment, false);
    } else {
      setEnabled(false);
      MainActivity.this.onBackPressed();
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

如果我不包含该setEnabled(false);行,则会收到堆栈溢出错误,这是有道理的。但肯定有一种更优雅的方式来提供默认行为吗?

android android-jetpack android-architecture-navigation

10
推荐指数
1
解决办法
3747
查看次数

AppCompat v7:21拆分操作栏坏了吗?

我目前正在开发一个应用程序,其中我使用了一个经过大量修改的Split Action Bar.这是应用程序当前状态的链接:

截图

您会注意到顶部有一个透明的操作栏,其中有一个自定义视图,底部有一个被黑客攻击的分割操作栏.底部视图实际上是一个单独的操作项,其中自定义视图充气并且showAlways = true.

目前我只支持SDK v15 +,我并不打算改变它,但是刚刚发布的Lollipop AppCompat库,我决定实现它,所以我可以在我的应用程序中获得一些非常棒的功能.

我已经将主题更改为Theme.AppCompat.Light,而我的MainActivity现在扩展了ActionBarActivity而不是Activity.

所有对getActionBar的引用现在都已切换到getSupportActionBar,只有这些更改,这就是我的活动现在的样子:

另一个截图

您会注意到我从设备监视器获得了一个UI转储,它将底部操作栏推入一个奇怪的空间并调用操作栏,并摆脱我的顶级自定义视图.

这是我设置操作栏的代码:

public void initializeActionBar(){
    View customNav = LayoutInflater.from(this).inflate(R.layout.action_bar_top, null);

    actionBar = getSupportActionBar();
    actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.transparent_fifty_percent));

    final PopupWindow window = addPopupWindow();

    actionBarOptions = (ImageView)customNav.findViewById(R.id.options);
    actionBarOptions.setVisibility(View.GONE);
    actionBarOptions.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.vertical_ellipsis, app.scaleByDensity(48)));
    actionBarOptions.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            window.showAsDropDown(actionBarOptions, 0, 0);
        }
    });
    TextView title = (TextView) customNav.findViewById(R.id.screen_title);
    Typeface font1 = Typeface.createFromAsset(getAssets(), "Merriweather-Italic.ttf");

    title.setText("Parsley");
    title.setTypeface(font1);

    actionBar.setCustomView(customNav);
    actionBar.setDisplayShowCustomEnabled(true);
    actionBar.setDisplayShowTitleEnabled(false);
    actionBar.setDisplayShowHomeEnabled(false);
    actionBar.setDisplayUseLogoEnabled(false);

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    new MenuInflater(this).inflate(R.menu.test, menu);


    LinearLayout …
Run Code Online (Sandbox Code Playgroud)

android android-appcompat android-actionbar

7
推荐指数
1
解决办法
3891
查看次数

Android KeyStore系统 - 保存KeyPair?

我目前正在尝试在我的Android应用程序中组合一个正常运行的KeyStore实现.我目前正在建立最低API为18,以便我可以充分利用KeyStore我的应用程序的私有.我试图生成n多个KeyPair对象,并将它们保存在KeyStore以后的检索中.我已经看过这个问题了,但它看起来有点过时(2012)并没有真正回答任何问题.老实说,我在Stack Overflow上发现的大多数问题似乎都非常过时,就像这里这里一样.

所以我的预期流程如下:

  1. 尝试从与相应别名相关的证书中检索公钥.
  2. 如果此公钥为null,则创建一个新密钥.
  3. 利用 KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
  4. 生成密钥对.

到目前为止,一切都非常直接,并且工作正常.接下来是毛茸茸的地方.

  1. 保存密钥对.通过初始化KeyStoreKeyStore.getInstance("AndroidKeyStore");
  2. 尝试生成一个X509Certificate通过X509V3CertificateGenerator.此证书是自签名的.对于证书,我将签名算法设置为"SHA1WithRSAEncryption".
  3. 最后,打电话 keyStore.setKeyEntry

最后一步似乎有两种选择:

keyStore.setKeyEntry(String alias, byte[] key, Certificate[] chain);

要么

keyStore.setKeyEntry(String alias, Key key, char[] password, Certificate[] chain);

我从两个中的第二个开始,但收到了java.security.KeyStoreException: entries cannot be protected with passwords....好吧,这很奇怪,为什么会有一个方法可以保证抛出异常?我们来试试1号门.

此时,当我调用setKeyEntry并传递keyPair.getPrivate().getEncoded()作为第二个参数时,我java.security.KeyStoreException: Operation not supported because key encoding is unknown从系统接收.

所以我有点不知所措.像这样的加密对我来说相对较新,所以我希望有人可以对Android KeyStore系统这一令人困惑的情况有所了解.

java encryption android android-keystore

6
推荐指数
1
解决办法
3641
查看次数