我已经完成了关于这个主题的几十个答案,遵循官方的快速入门指南,完成了我能想到的一切.
我已经在其所有部分设置了我的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)一起工作,但并不孤单.为什么这样,我该怎么办?
我想将我的位图保存到缓存目录.我用这个代码:
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
我有一个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子域有些困惑.
什么是ghs.googlehosted.com,为什么我需要在www子域上使用CNAME?为什么没有www的记录?
子域如何工作?我没有A记录,只有这个CNAME,但它仍指向我的IP.
当它说:我不明白指南:
通常,您会列出主机名以及规范名称作为地址.在我们的示例中,您要添加的记录之一是主机名www,地址为ghs.googlehosted.com.(如果使用裸域,则使用@作为主机名和添加新自定义域表单中的相应值.)
你能解释一下这一段的含义吗?这是什么 @?
由于我们只有一个基本功能模块和一个功能模块,我们可以App
在功能模块中声明该类并将我们的图加载到那里。这意味着能够使用ContributesAndroidInjector
android 的标准 dagger 方法。
现在,添加更多功能模块,我们不能做同样的事情。应用程序类必须留在基础功能模块中,这意味着它不能声明,例如,属于功能的活动。
我的想法:
由于AndroidInjection.inject(this)
会在 app 类中寻找活动注入器,所以我们不能使用它。换句话说,没有DaggerAppCompatActivity
。
所以这个想法是属于功能模块的活动应该创建自己的组件并注入自己。
尽管如此,片段应该可以使用这个@ContributesAndroidInjector
东西。对?该AndroidInjection
课程将得到父活动喷油器,所以如果我们解决我们的活动,他们将暴露在正确的喷油器,使片段代码可以保留原样。
因此,功能活动必须实现HasFragmentInjector
并为片段@Inject
添加注释DispatchingAndroidInjector
。
但是有两件事在这里不起作用。
特征片段和活动仍然需要@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
,而是在其附加模块中)
我已经读到将它们直接暴露在 中 …
我正在使用 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,但对我来说不是这样。有任何想法吗?
我正在尝试将材质文本选择句柄引入我的应用程序。我从 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) 我试图实现新的一些问题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
我在 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
(虽然我从未使用过它并且不知道它是如何工作的),但这对我来说有点烦人(我不是很喜欢图形)。
我的Instagram服务器端登录流程遇到了麻烦.我在用:
passport.js
我在我的Node.js服务器上的域名(passport-instagram) example.com
WebView
在我的Android客户端.问题是,有时在键入凭据后,客户端不会重定向到回调URL.
https://example.com/auth/instagram:用户访问我的服务器并重定向到instagram
https://example.com/auth/redirect/instagram?code=YYYYY:我们到达了回调网址
https://example.com/auth/instagram:用户访问我的服务器并重定向到instagram
正如您所看到的,在登录结束时,我不是被重定向到我的服务器,而是最终进入https://www.instagram.com/(顺便说一句,已成功登录).
为什么会这样?
我不知道自己.一切似乎都正确编码.可能是一些WebView
必须调整的Android 设置(但是同一个WebView在与其他auth提供程序进行身份验证时效果很好),可能是一些passport.js
配置错误(但我成功地将其用于所有其他提供程序),...
一段时间后,我重新打开了一个 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 ×9
android-file ×1
cname ×1
dagger ×1
dagger-2 ×1
dex ×1
dex2oat ×1
dns ×1
google-api ×1
google-plus ×1
instagram ×1
kotlin ×1
nine-patch ×1
oauth-2.0 ×1
passport.js ×1
subdomain ×1