我正在尝试将Google登录集成到我的应用中.我没有后端服务器,我只是将登录的Google帐户的详细信息提供给我的应用程序.
我首先尝试使用Google登录示例,但是我收到了一个错误(除了打印下面的堆栈跟踪之外,没有更改代码).我只使用了示例SignInActivity,因为我没有后端服务器.
Exception com.google.android.gms.common.api.ApiException: 12500:
at com.google.android.gms.common.internal.zzb.zzz(Unknown Source)
at com.google.android.gms.auth.api.signin.GoogleSignIn.getSignedInAccountFromIntent(Unknown Source)
at com.ewise.android.api.MainActivity.onActivityResult(SignInActivity.java:89) at android.app.Activity.dispatchActivityResult(Activity.java:7010)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4187)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4234)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1584)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6316)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)
Run Code Online (Sandbox Code Playgroud)
码
public class SignInActivity extends AppCompatActivity implements
View.OnClickListener {
private static final String TAG = "SignInActivity";
private static final int RC_SIGN_IN = 9001;
private GoogleSignInClient mGoogleSignInClient;
private TextView mStatusTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Views
mStatusTextView = findViewById(R.id.status); …Run Code Online (Sandbox Code Playgroud) 我是android的新手,我刚刚克隆了一个Android项目.
当Android Studios在打开项目时执行索引时,我会一直收到此错误.
这是我从Android Studio获得的错误.
Error:(89, 0) Failed to delete original file 'C:\Users\myname\AppData\Local\Temp\gradle_download8065263342645015068bin'
after copy to 'C:\Users\myname\.gradle\caches\modules-2\files-2.1\com.android.tools.build\gradle\1.5.0\1c3d2b23212349ffbe6479fcb04732c5cddaf98b\gradle-1.5.0.pom'
<a href="openFile:D:\myname\mobile-myapp-tester\platforms\android\build.gradle">Open File</a>
Run Code Online (Sandbox Code Playgroud) 我在项目中使用人行横道作为网络视图,现在我想出于某些目的覆盖替换类。
原班
org.xwalk.core.internal
imports....
class SslUtil {
public static boolean shouldDenyRequest(int error) {
switch(error) {
case NetError.ERR_CERT_COMMON_NAME_INVALID:
case NetError.ERR_CERT_DATE_INVALID:
case NetError.ERR_CERT_AUTHORITY_INVALID:
case NetError.ERR_CERT_WEAK_SIGNATURE_ALGORITHM:
case NetError.ERR_CERT_WEAK_KEY:
case NetError.ERR_CERT_NAME_CONSTRAINT_VIOLATION:
case NetError.ERR_CERT_VALIDITY_TOO_LONG:
case NetError.ERR_CERT_CONTAINS_ERRORS:
case NetError.ERR_CERT_REVOKED:
case NetError.ERR_CERT_INVALID:
case NetError.ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY:
case NetError.ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN:
return true;
default:
break;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想做的是通过复制包名称和类 nam 来替换它。
org.xwalk.core.internal
imports....
class SslUtil {
public static boolean shouldDenyRequest(int error) {
//I'll do my custom handling of error
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
当我刚刚使用 Android Studio 运行时,这是可能的,因为 IDE 会询问我应该使用什么 SslUtil。但是,由于重复的文件,我将无法生成签名的 …
我使用Crosswalk XWalkView作为我的应用程序的webview,现在我正在加载一些具有有效证书的网站,并且在Android版本<7中工作正常.
但是对于Android 7.0及更高版本,我得到了这个Toast消息,请求REQUEST拒绝安全
和这个日志
06-12 17:46:46.024 22518-22731/? I/X509Util: Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
Run Code Online (Sandbox Code Playgroud)
我读了一些类似的问题,但是发布的解决方案是在Cordova(见这个).我正在使用原生的android,我想知道我怎么能在我的结尾(本机)做到这一点.
引用链接
我通过将以下代码段的最后3行添加到config.xml来解决这个问题:
<allow-navigation href="http://*/*" />
<allow-navigation href="https://*/*" />
<allow-navigation href="data:*" />
Run Code Online (Sandbox Code Playgroud)
谢谢!
基本上我想做的就是像Cordova那样有一些白名单,但我不知道如何使用Native Android和Crosswalk实现这一目标.首先,我不知道在原生android中是否存在config.xml(在cordova中),现在我真的需要知道如何在我的项目中实现它.
我正在使用shouldInterceptRequest拦截来自webview的请求
下面是我返回WebResourceResponse的代码
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static WebResourceResponse handleRequestViaUrlOnly(WebResourceRequest webResourceRequest){
String url = webResourceRequest.getUrl().toString();
Log.i("intercepting req....!!!", url);
String ext = MimeTypeMap.getFileExtensionFromUrl(url);
String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext);
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setRequestProperty("Sample-Header", "hello");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
return new WebResourceResponse(mime, "UTF-8", conn.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
我在CustomWebViewClient中调用此方法
class CustomWebViewClient extends WebViewClient {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return handleRequestViaUrlOnly(request);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在chrome:// inspect /#devices中检查来自WebView远程调试器的请求标头时.
我添加的附加RequestProperty不存在.
conn.setRequestProperty("Sample-Header", "hello");
Run Code Online (Sandbox Code Playgroud)
WebView中的请求标头中不存在Sample-Header.
我错过了什么吗?我会感激任何帮助.
我想使用两个外键获取现有记录。
基本上,我在这里拥有的是一条具有起点和终点的路线(两者都是终端实体)。
我的目标是创建一个函数来使用我的起点和目的地作为查询中的条件来获取路线记录。我目前不知道如何使用 Spring Data JPA 做到这一点。
下面是我的实体和关系映射。
@Entity
@Table(name = "ROUTE")
public class Route implements Serializable {
public Route() {}
public Route(Terminal origin, Terminal destination, int totalKM) {
this.origin = origin;
this.destination = destination;
this.totalKM = totalKM;
}
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "ROUTE_ID")
private long id;
@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REMOVE})
@JoinColumn(name = "TERMINAL_ORIGIN_ID")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="id")
private Terminal origin;
@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REMOVE})
@JoinColumn(name = "TERMINAL_DESTINATION_ID")
private Terminal destination;
//...Getters and Setters
}
@Entity
@Table(name = …Run Code Online (Sandbox Code Playgroud) 我想获得这个示例 android xml 布局的顶级布局。我指的顶层是将整个活动结合在一起的 ViewGroup。
我知道
getWindow().getDecorView().findViewById(android.R.id.content);
Run Code Online (Sandbox Code Playgroud)
但我不需要 DecorView。
请参考下面的xml。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linearLayout">
<WebView
android:id="@+id/my_webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
我需要获取RelativeLayout(这是我指的顶级布局,如果我的术语有误,请纠正我)。我可以使用下面的代码来获取它。
WebView webView = (WebView) findViewById(R.id.my_webview);
webview.getParent().getParent()
Run Code Online (Sandbox Code Playgroud)
但是,如果布局嵌套得更深怎么办?
<Layout>
<Layout>
<Layout>
<Webview/>
<Layout>
<Layout>
<Layout>
Run Code Online (Sandbox Code Playgroud)
如何在不使用 getParent() 的情况下获得顶级布局。谢谢!
我在我的Android库项目中使用AsyncTask来避免networkonmainthreadexception,现在我想做的是将值返回到我的变量并在执行下一行代码之前等待它.我使用CountDownLatch来做到这一点.
我执行我的请求并调用我的AsyncTask的方式如下所示.所以我使用CountDownLatch等待响应,然后返回我想要返回的值.
public MyObject getMyObject(){
final String url = "http://[myip]:8080/retrieve";
try{
Response response = executeRequest(url);
final MyObject myObject = om.readValue(response.body().string(),
new TypeReference<MyObject>() {
});
return myObject;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private Response executeRequest(String url){
try {
//Simplified please just ignore this..
GenericAsyncParams genericAsyncParams = createParams(......);
final CountDownLatch countDownLatch = new CountDownLatch(1);
ResponseListener responseListener = new ResponseListener(countDownLatch);
MyAsyncTask myAsyncTask = new AsyncTask(responseListener);
myAsyncTask.execute(genericAsyncParams);
countDownLatch.await();
//get the response from the listener class.
Response response = responseListener.getResponse(); …Run Code Online (Sandbox Code Playgroud)