小编nat*_*rio的帖子

使用G +登录 - 为什么范围"plus.login"不能单独使用?

我已经完成了关于这个主题的几十个答案,遵循官方的快速入门指南,完成了我能想到的一切.

我已经在其所有部分设置了我的Google开发者控制台,包括为OAuth和公共API访问设置正确的调试SHA1密钥(甚至不知道是否有必要).

问题

我有问题将范围设置为我的GoogleApiClient.

googleClient = new GoogleApiClient.Builder(this)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .addApi(Plus.API)
        .addScope(...)
        .build();
Run Code Online (Sandbox Code Playgroud)

我可以使用不同的范围组合登录:

            .addScope(new Scope("https://www.googleapis.com/auth/plus.login"))
            .addScope(new Scope("https://www.googleapis.com/auth/plus.profile.emails.read"))
            //WORKS! OR:

            .addScope(Plus.SCOPE_PLUS_LOGIN) // == https://www.googleapis.com/auth/plus.login
            .addScope(Plus.SCOPE_PLUS_PROFILE) // == https://www.googleapis.com/auth/plus.me
            //WORKS! OR:

            .addScope(new Scope("https://www.googleapis.com/auth/plus.profile.emails.read"))
            //WORKS! OR:

            .addScope(Plus.SCOPE_PLUS_PROFILE) // == https://www.googleapis.com/auth/plus.me
            //WORKS!
Run Code Online (Sandbox Code Playgroud)

它们都运行良好,我看到它们反映在请求中(即,如果我设置login+ emails.read,对话框实际上会要求这两个).

但是,我只需要" https://www.googleapis.com/auth/plus.login ".如果我只是设置.addScope(new Scope("https://www.googleapis.com/auth/plus.login")),或等效,.addScope(Plus.SCOPE_PLUS_LOGIN)我遇到了文档Toast错误:

发生内部错误.

所以这个范围(我唯一需要的)与其他人(例如plus.me)一起工作,但并不孤单.为什么这样,我该怎么办?

android google-api google-plus google-plus-signin

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

如何才能第二次正确保存我的位图?

我想将我的位图保存到缓存目录.我用这个代码:

try {
        File file_d = new File(dir+"screenshot.jpg");
        @SuppressWarnings("unused")
        boolean deleted = file_d.delete();
    } catch (Exception e) {
        // TODO: handle exception
    }

    imagePath = new File(dir+"screenshot.jpg");
    FileOutputStream fos;
    try {
        fos = new FileOutputStream(imagePath);
        bitmap.compress(CompressFormat.JPEG, 100, fos);
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        Log.e("GREC", e.getMessage(), e);
    } catch (IOException e) {
        Log.e("GREC", e.getMessage(), e);
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常.但是,如果我想将不同的img保存到相同的路径,那么就会出现问题.我的意思是它被保存到相同的路径,但我看到它的旧图像,但当我点击图像,我可以看到我第二次保存的正确图像.

也许它来自缓存,但我不想看到旧图像,因为当我想与whatsapp旧图像共享该图像时,如果我发送图像似乎是正确的.

我想在whatsapp上分享已保存的图像,如下代码:

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imagePath));
shareIntent.setType("image/jpeg");
startActivityForResult(Intent.createChooser(shareIntent, getResources().getText(R.string.title_share)),whtsapp_result);
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

提前致谢.

android android-layout android-imageview android-file android-bitmap

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

了解Google App Engine应用的DNS要求

我有一个Google App Engine正在运行,我已经购买了一个域名.为了将两者联系起来,我遵循了官方指南.

具体而言,本指南建议设置以下DNS规则:

在此输入图像描述

问题是,我拥有裸域(site.com)和www子域(www.site.com).按照指南,我设置了以下规则:

Type      Name               Value
A         site.com.          216.239.32.21
A         site.com.          216.239.34.21
A         site.com.          216.239.36.21
A         site.com.          216.239.38.21
(other AAAA for site.com.)
CNAME     www.site.com.      ghs.googlehosted.com
Run Code Online (Sandbox Code Playgroud)

问题

认为我所做的是正确的,因为它的工作原理:我可以输入site.com和www.site.com并将其定向到我的应用程序.但是我对www子域有些困惑.

  1. 什么是ghs.googlehosted.com,为什么我需要在www子域上使用CNAME?为什么没有www的记录?

  2. 子域如何工作?我没有A记录,只有这个CNAME,但它仍指向我的IP.

  3. 当它说:我不明白指南:

通常,您会列出主机名以及规范名称作为地址.在我们的示例中,您要添加的记录之一是主机名www,地址为ghs.googlehosted.com.(如果使用裸域,则使用@作为主机名和添加新自定义域表单中的相应值.)

你能解释一下这一段的含义吗?这是什么 @?

subdomain dns google-app-engine cname

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

如何为 Android 功能模块声明 Dagger 活动和片段?

如何为非基本功能模块声明活动和片段?

由于我们只有一个基本功能模块和一个功能模块,我们可以App在功能模块中声明该类并将我们的图加载到那里。这意味着能够使用ContributesAndroidInjectorandroid 的标准 dagger 方法。

现在,添加更多功能模块,我们不能做同样的事情。应用程序类必须留在基础功能模块中,这意味着它不能声明,例如,属于功能的活动。


我的想法:

  • 由于AndroidInjection.inject(this)会在 app 类中寻找活动注入器,所以我们不能使用它。换句话说,没有DaggerAppCompatActivity

  • 所以这个想法是属于功能模块的活动应该创建自己的组件并注入自己。

  • 尽管如此,片段应该可以使用这个@ContributesAndroidInjector东西。对?该AndroidInjection课程将得到父活动喷油器,所以如果我们解决我们的活动,他们将暴露在正确的喷油器,使片段代码可以保留原样。

  • 因此,功能活动必须实现HasFragmentInjector并为片段@Inject添加注释DispatchingAndroidInjector

但是有两件事在这里不起作用。


  1. 特征片段和活动仍然需要@Singleton来自基础特征组件图中的一些带注释的对象,所以我们SpecialFeatureComponent必须以某种方式链接到BaseFeatureComponent.

    似乎这样做的唯一方法是使用dependencies参数:

    @Component(
            dependencies = [BaseFeatureComponent::class],
            modules = [SpecialFeatureModule::class] // @contributes fragment
    )
    interface SpecialFeatureComponent
    
    Run Code Online (Sandbox Code Playgroud)

    SpecialActivity创建这个组件,传递BaseFeatureComponent给它的建造者,并注入本身。

    但是,由于MissingBinding错误,编译失败。特殊功能模块中的某些对象需要@Provide@Singleton来自基础功能组件的带注释的对象,而 dagger 似乎无法正确找到它们。(这些对象不在 中BaseFeatureComponent,而是在其附加模块中)

    如何解决这个问题?

    我已经读到将它们直接暴露在 中 …

android dependency-injection kotlin dagger dagger-2

6
推荐指数
0
解决办法
906
查看次数

为什么 findViewById(R.android.id.home) 总是返回 null?

我正在使用 AppCompat 并尝试调用ImageView属于工具栏的向上/后退按钮。

我知道R.android.id.home存在,因为我可以将其单击作为菜单项进行管理:

public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
         //this works
    }
    return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)

除此之外,每当我试图调用findViewById(android.R.id.home)-是它onCreate,是它onClick自定义按钮的-我得到空。如果在上面的示例中,我调用findViewById(item.getItemId()).

为什么?这个问题在这里之前已经被问过,大多数时候是关于 ActionBarSherlock (我没有使用)。另一次建议使用:

getWindow().getDecorView().findViewById(android.R.id.home)
Run Code Online (Sandbox Code Playgroud)

但它不起作用。在那个问题中,OP 还说findViewById(android.R.id.home)适用于 API>3.0,但对我来说不是这样。有任何想法吗?

android android-navigation

5
推荐指数
1
解决办法
2214
查看次数

无法将 colorFilter 应用于文本选择手柄

我正在尝试将材质文本选择句柄引入我的应用程序。我从 SDK 中获取了中/右/左手柄(位图)和文本光标(9 块)的可绘制对象,并设置:

<item name="android:textSelectHandleLeft">@drawable/text_select_handle_left_mtrl_alpha</item>
<item name="android:textSelectHandleRight">@drawable/text_select_handle_right_mtrl_alpha</item>
<item name="android:textSelectHandle">@drawable/text_select_handle_middle_mtrl_alpha</item>
<item name="android:textCursorDrawable">@drawable/text_cursor_mtrl_alpha</item>
Run Code Online (Sandbox Code Playgroud)

它按预期工作。但是,在 Lollipop 中,这些可绘制对象使用 XML 中的属性着色为特定颜色android:tint,但我无法在 API<21 上使用该属性。所以我尝试在运行时设置滤色器。

在此输入图像描述

  • 文本光标不会着色。我认为这可能是因为它是 9 补丁。如何在运行时过滤 9 补丁可绘制对象?我可能尝试了所有的PorterDuff.Mode

  • 右/左手柄为黑色,中间手柄为白色。

即,它们都不是我想要的绿色。为什么?

正如您在上面看到的,我在ImageView编辑文本下方设置了四个,但它们却被着色了。

   private void setUpTextCursors() {
        Drawable left = getResources().getDrawable(R.drawable.text_select_handle_left_mtrl_alpha);
        Drawable right = getResources().getDrawable(R.drawable.text_select_handle_right_mtrl_alpha);
        Drawable middle = getResources().getDrawable(R.drawable.text_select_handle_middle_mtrl_alpha);
        Drawable cursor = getResources().getDrawable(R.drawable.text_cursor_mtrl_alpha);
        ColorFilter cf = new PorterDuffColorFilter(mGreenColor, PorterDuff.Mode.SRC_IN);

        /**
        * tint my ImageViews, but no effect on edit text handles
        */
        left.setColorFilter(cf); 
        right.setColorFilter(cf);
        middle.setColorFilter(cf);

        /**
        * no effect whatsoever …
Run Code Online (Sandbox Code Playgroud)

android nine-patch android-bitmap material-design

5
推荐指数
1
解决办法
2539
查看次数

CollapsingToolbarLayout中的ImageView没有覆盖全高?

我试图实现新的一些问题CollapsingToolbarLayout.滚动,扩展和折叠确实可以正常工作,但是我ImageView(无论我设置的资源类型)都没有覆盖扩展工具栏的整个高度.看这里:

扩大 倒塌

在这里我设置android:src="@color/red"了图像视图,但它从未覆盖真正的工具栏.它也不适用于位图.我在下面发布我的布局.

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <!-- content -->
    <android.support.design.widget.CoordinatorLayout
        android:fitsSystemWindows="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.design.widget.AppBarLayout
            android:layout_height="@dimen/appbar_expanded_height"
            android:layout_width="match_parent"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            android:fitsSystemWindows="true">
            <android.support.design.widget.CollapsingToolbarLayout
                android:layout_height="match_parent"
                android:layout_width="match_parent"
                app:layout_scrollFlags="scroll|exitUntilCollapsed"
                app:expandedTitleMarginStart="48dp"
                app:expandedTitleMarginEnd="64dp"
                app:contentScrim="?attr/colorPrimary"
                android:fitsSystemWindows="true">

                <ImageView
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:fitsSystemWindows="true"
                    android:src="@color/red_600"
                    android:scaleType="centerCrop"
                    app:layout_collapseMode="parallax"
                    />
                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    app:layout_collapseMode="pin"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize">
                </android.support.v7.widget.Toolbar>

            </android.support.design.widget.CollapsingToolbarLayout>
        </android.support.design.widget.AppBarLayout>

        <!-- I load fragments here -->
        <FrameLayout
            android:id="@+id/fragment_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    </android.support.design.widget.CoordinatorLayout>

    <!-- nav drawer -->
    <fragment
        android:layout_width="@dimen/drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"/>
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

在我看来,与奶酪-Chris Banes-app的唯一区别在于,我正在给予app:layout_behavior一个FrameLayout.但是,在该框架内,我加载了具有NestedScrollView作为根视图的片段,这似乎工作正常.

android android-layout android-design-library androiddesignsupport

5
推荐指数
2
解决办法
3963
查看次数

在字符级别更改 EditText 中的前导/行高

我在 EditText 的开头和结尾实施了粗体、大、不可编辑的“智能引号”:

在此处输入图片说明

引号是文本的不可选择部分,我在其上设置了RelativeSizeSpan(2f). 结果几乎是我想要的。

s.setSpan(spanLeft, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
s.setSpan(spanRight, s.length() - 1, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

但是,正如您所看到的,更大的字体会导致更大的高度,从而影响整行。这在第一行是无关紧要的,但在最后一行却令人不快。我想知道这两个字符是否有可能保持字体大小但降低行高。

在此处输入图片说明

我想减少前导部分,以便第一行和最后一行与段落的其余部分具有一致的高度。我最大的愿望是将引号转换为基线,同时保持其外观。

你有什么建议吗?这是可能的Span吗?我应该放弃吗?你看到任何解决方法吗?

我看到我可以用引号创建两个 png 并使用ImageSpan(虽然我从未使用过它并且不知道它是如何工作的),但这对我来说有点烦人(我不是很喜欢图形)。

android android-layout android-edittext spannablestring

5
推荐指数
1
解决办法
927
查看次数

在向Instagram进行身份验证时,没有重定向到回调URL

我的Instagram服务器端登录流程遇到了麻烦.我在用:

  • passport.js 我在我的Node.js服务器上的域名(passport-instagram) example.com
  • 一个简单的WebView在我的Android客户端.

问题是,有时在键入凭据后,客户端不会重定向到回调URL.

当一切正常时,这些是从客户端看到的URL:

这些是当流工作时从客户端看到的URL :

正如您所看到的,在登录结束时,我不是被重定向到我的服务器,而是最终进入https://www.instagram.com/(顺便说一句,已成功登录).

为什么会这样?

我不知道自己.一切似乎都正确编码.可能是一些WebView必须调整的Android 设置(但是同一个WebView在与其他auth提供程序进行身份验证时效果很好),可能是一些passport.js配置错误(但我成功地将其用于所有其他提供程序),...

android oauth-2.0 instagram passport.js instagram-api

5
推荐指数
1
解决办法
1048
查看次数

安装应用程序需要几分钟时间,并出现 dex2oat 警告

一段时间后,我重新打开了一个 Android Studio 项目,并且像往常一样看到了快速构建,但现在 Android Studio (3.5) 的“安装”步骤需要几分钟,而过去需要几秒钟。

如果我在安装时打开设备 Logcat,我可以看到大量这些:

W/dex2oat: Method processed more than once: void com.package.base.view.BaseDialog.onSaveInstanceState(android.os.Bundle)
W/dex2oat: Method processed more than once: void com.package.base.view.BaseDialog.onViewCreated(android.view.View, android.os.Bundle)
W/dex2oat: Method processed more than once: void com.package.base.view.BaseDialog.onViewModelCreated()
W/dex2oat: Method processed more than once: void com.package.base.view.BaseDialog.removeCancelListener(com.package.base.view.BaseDialog$CancelListener)
W/dex2oat: Method processed more than once: void com.package.base.view.BaseDialog.removeDismissListener(com.package.base.view.BaseDialog$DismissListener)
W/dex2oat: Method processed more than once: void com.package.base.view.BaseDialog.setChildFragmentInjector(dagger.android.DispatchingAndroidInjector)
W/dex2oat: Method processed more than once: void com.package.base.view.BaseDialog.setSharedValue(java.lang.String, java.lang.Object)
W/dex2oat: Method processed more than once: void com.package.base.view.BaseDialog.setViewModelFactory(androidx.lifecycle.ViewModelProvider$Factory)
W/dex2oat: Method processed more …
Run Code Online (Sandbox Code Playgroud)

android dex android-studio android-multidex dex2oat

5
推荐指数
1
解决办法
4079
查看次数