是否可以设置选择器对话框的主题?
import com.google.android.gms.common.AccountPicker;
....
String[] accountTypes = new String[]{"com.google"};
Intent intent = AccountPicker.newChooseAccountIntent(null, null,
accountTypes, false, null, null, null, null);
activity.startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT);
Run Code Online (Sandbox Code Playgroud)
我的基本应用主题是android:Theme.Light但对话框很暗.谢谢.
android android-theme google-authenticator android-authenticator google-play-services
最近我看到 Firebase Crashlytic 在以下方面报告的错误有所增加
Caused by java.lang.SecurityException: uid 10172 cannot explicitly add accounts of type: com.mypackage.account
at android.os.Parcel.createException(Parcel.java:2087)
at android.os.Parcel.readException(Parcel.java:2055)
at android.os.Parcel.readException(Parcel.java:2003)
at android.accounts.IAccountManager$Stub$Proxy.addAccountExplicitly(IAccountManager.java:1660)
at android.accounts.AccountManager.addAccountExplicitly(AccountManager.java:889)
Run Code Online (Sandbox Code Playgroud)
它是从
accountManager.addAccountExplicitly(defaultAccount, null, null)
Run Code Online (Sandbox Code Playgroud)
根据 Firebase Crashlytic 报告,它仅在 Android 9 和 10 以及三星、Realme 和 OPPO 设备上发生
最后,我尝试在 Android P 和 Android 10 设备上进行复制,并且代码没有问题地被触发。
我已经通过 StackOverflow 进行了搜索,例如
Android 应用程序在 addAccountExplicitly(account, password, null) 上崩溃;, Android SecurityException: uid xxxxx 无法显式添加账户, /sf/answers/4101384241/ , /sf/answers/2614423661/ , /sf/answers/1188043391/ /3286489和Android 添加帐户与 AccountManager。
它们用于可复制的问题,因此它对我没有用。
我检查也发现像
https://github.com/signalapp/Signal-Android/issues/9311 (Android …
我正在尝试使用HttpUrlConnection类将我的Android应用程序连接到IIS服务器.
我的服务器需要用户进行身份验证,因此它向客户端发送以下质询:
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Run Code Online (Sandbox Code Playgroud)
我的问题是HttpUrlConnection似乎没有解析它.因此,getPasswordAuthentication()永远不会调用,并返回IOException"未发现身份验证质询".
这是我的代码:
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("myUsername", "myPassword".toCharArray());
}
});
URL url = new URL(myUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept-Encoding", "gzip");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("Connection", "close");
conn.setDoOutput(true);
conn.setDoInput(true);
try
{
conn.connect();
status_code = conn.getResponseCode();
}catch (IOException e) {
...
}
Run Code Online (Sandbox Code Playgroud)
我真的开始认为HttpUrlConnection不支持NTLM挑战.我看到一些图书馆似乎在做这项工作,但我不想使用外部库.
有人可以确认是否有可能在没有外部库的情况下使HttpUrlConnection处理NTLM挑战?
我有两个使用相同帐户类型的应用.我希望当用户第一次打开第二个应用并且存在一个帐户时,会显示以下页面:
但是当我运行这段代码时没有任何反应:
final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, authTokenType, null, this, null, null);
new Thread(new Runnable() {
@Override
public void run() {
try {
Bundle bnd = future.getResult();
final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
showMessage((authtoken != null) ? "SUCCESS!\ntoken: " + authtoken : "FAIL");
Log.d("udinic", "GetToken Bundle is " + bnd);
} catch (Exception e) {
e.printStackTrace();
showMessage(e.getMessage());
}
}
}).start();
Run Code Online (Sandbox Code Playgroud)
当我从具有验证器的应用程序运行它时,上面的代码正常工作.当我在代码下面运行时,系统会生成一个通知,当我点击它时,会出现上面的图片.
final AccountManagerFuture<Bundle> future = mAccountManager
.getAuthToken(account, authTokenType, null, true,
null, handler);
Run Code Online (Sandbox Code Playgroud)
单击允许按钮可AuthToken正确返回.但是我希望在通话时看到授权许可页面(上图)getAuthToken,而不是点击通知.我怎样才能做到这一点?
我按照此说明添加了我的同步适配器.
但是有一个小问题:-(
当我打开设置 - >帐户 - >添加帐户并选择我的帐户时,我收到此错误消息
java.lang.IllegalArgumentException: addAccount not supported
at android.accounts.AccountManager.convertErrorToException(AccountManager.java:2147)
at android.accounts.AccountManager.-wrap0(AccountManager.java)
at android.accounts.AccountManager$AmsTask$Response.onError(AccountManager.java:1993)
at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69)
at android.os.Binder.execTransact(Binder.java:453)
Run Code Online (Sandbox Code Playgroud)
看起来这次崩溃来自将Authenticator Java类转换为Kotlin类.
Java类就像这样锁定
public class Authenticator extends AbstractAccountAuthenticator {
private final Context mContext;
// Simple constructor
public Authenticator(Context context) {
super(context);
mContext = context;
}
// Editing properties is not supported
@Override
public Bundle editProperties(AccountAuthenticatorResponse response,
String accountType) {
throw new UnsupportedOperationException();
}
@Override
public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
String authTokenType, String[] requiredFeatures, Bundle options) …Run Code Online (Sandbox Code Playgroud) 我按照Google的快速启动示例设置了GMail API:https://developers.google.com/gmail/api/quickstart/android
我的应用成功请求GET_ACCOUNTS权限,并允许用户选择他/她的Gmail帐户.所选帐户将保存在SharedPreferences中以供以后访问.
通过IntentService,我的应用程序会发送一封电子邮件.我按照此处的说明操作:https://developers.google.com/gmail/api/guides/sending,并根据需要包含activation.jar,additional.jar和mail.jar库.当我发送带有以下代码的电子邮件时,我得到一个UserRecoverableAuthUIException:
message = service.users().messages().send(userId, message).execute();
Run Code Online (Sandbox Code Playgroud)
当我捕获异常时,获取与异常一起存储的意图,并将意图作为新活动启动,我会看到一个对话框,让我有机会允许我的应用程序使用我的GMail帐户发送电子邮件:
在此对话框上按"允许"后,我的应用程序会发送电子邮件而不会出现任何其他问题.我的应用也会显示在我的Google帐户的在线权限页面上,表示它有权发送电子邮件.
当我第一次获取用户的帐户名而不是等待发生异常时,有没有办法手动触发此对话框?
UPDATE
我已经能够提取存储在intent中的动作和数据,如果这有助于任何:
其中KEY是一系列字符,可能链接到我的帐户或是一个令牌.
编辑:
以下是创建Credentials对象并启动我正在使用的帐户选择器活动的代码:
private GoogleAccountCredential mCredential;
private static final String[] SCOPES = { GmailScopes.GMAIL_COMPOSE };
Run Code Online (Sandbox Code Playgroud)
内部构造函数:
mCredential = GoogleAccountCredential.usingOAuth2(
getApplicationContext(), Arrays.asList(SCOPES))
.setBackOff(new ExponentialBackOff());
Run Code Online (Sandbox Code Playgroud)
我在哪里获得帐户:
private void chooseGMailAccount() {
String accountName = this.getSharedPreferences(getString(R.string.shared_pref_main),
Context.MODE_PRIVATE)
.getString(getString(R.string.srd_pref_gmail_account), null);
if (accountName != null) {
mCredential.setSelectedAccountName(accountName);
configureGMailAPI();
} else {
startActivityForResult(
mCredential.newChooseAccountIntent(),
REQUEST_ACCOUNT_PICKER);
}
}
Run Code Online (Sandbox Code Playgroud) android android-authenticator google-oauth gmail-api android-googleapiclient
我不明白方法confirmCredentials是如何工作的.我从未在Android UI中看到任何类似"确认凭据"之类的选项,只有"创建帐户"和"删除帐户".
我正在挖掘GitHub android应用程序源代码.
我试图找出他们如何强制LoginActivity在应用程序首次启动时显示.在它们的清单中,它们似乎具有HomeActivityMAIN并且LoginActivity仅被明确地启动.
这意味着HomeActivity应用程序首次打开时始终会启动.但是,我没有看到HomeActivity中的任何逻辑表明他们检查帐户是否存在,如果它不存在则转到LoginActivity
在代码LoginActivity中只从这里启动.
我正在编写一个Android应用程序,我需要从该帐户请求一个Auth令牌.获取帐户列表和令牌很容易,我到目前为止工作.
问题是Jelly Bean打开一个弹出窗口,要求用户许可.现在我的问题:
有没有办法找出弹出窗口是否会在请求authtoken 之前出现,即等到它不再需要(例如,如果用户安装了相关的应用程序但从未使用过,或者authtoken是否已过期?)然后请求它?
我知道大多数Android用户都非常缺乏经验,并且可能会因为一些权限请求而感到害怕,我想避免在触发此用户弹出窗口时请求authtoken.
java android access-token android-authenticator android-4.2-jelly-bean
我正在构建一个Android应用程序,我需要使用指纹api通过用户名和密码(在备份上)对用户进行身份验证.
这是我用最简单的术语理解我需要做的事情.
在用户输入用户名和密码并使用后端成功验证后登录时,我生成并将具有这些凭据的特定密钥库存储到androidkeystore.
在下次登录时,如果用户通过指纹成功进行身份验证,则从android密钥库中检索凭据(用户名和密码),并使用这些凭据在后端对用户进行身份验证.
我已经关注:http: //www.techotopia.com/index.php/An_Android_Fingerprint_Authentication_Tutorial
这给出了如何使用指纹API通过设备对用户进行身份验证的一个很好的示例.但是如何获取凭据,以便我可以使用后端对用户进行身份验证?
我想做什么的步骤,建议或详细示例?
谢谢.
android android-authenticator android-keystore android-security android-fingerprint-api
android ×10
java ×2
access-token ×1
auth-token ×1
github ×1
gmail-api ×1
google-oauth ×1
kotlin ×1
ntlm ×1