android - Android webview:抛出一些令牌错误。google.android.gms。一些东西加上 webcookies 没有正确缓存
问题描述
我有一个 webview 应用程序。我实际上将包名称重构为旧应用程序。那一个实际上是在使用 firebase 消息传递。我在我的版本中删除了对 firebase 的所有引用。但它仍然抛出一个错误。
2019-07-15 23:34:49.191 13878-13878/? E/volley is: 0/
2019-07-16 02:24:51.997 30248-1014/? E/NetRec: [351] alcs.a: Could not retrieve server token for package com.google.android.apps.gcs
java.util.concurrent.ExecutionException: rdg: 29503:
at avgq.b(:com.google.android.gms@17785040@17.7.85 (100700-253824076):3)
at avgq.a(:com.google.android.gms@17785040@17.7.85 (100700-253824076):20)
at alcs.a(:com.google.android.gms@17785040@17.7.85 (100700-253824076):1)
at alcs.a(:com.google.android.gms@17785040@17.7.85 (100700-253824076):4)
at alcr.getHeaders(:com.google.android.gms@17785040@17.7.85 (100700-253824076):2)
at com.android.volley.toolbox.HttpClientStack.performRequest(:com.google.android.gms@17785040@17.7.85 (100700-253824076):9)
at sdc.performRequest(:com.google.android.gms@17785040@17.7.85 (100700-253824076):1)
at bwt.executeRequest(:com.google.android.gms@17785040@17.7.85 (100700-253824076):1)
at com.android.volley.toolbox.BasicNetwork.performRequest(:com.google.android.gms@17785040@17.7.85 (100700-253824076):5)
at sdf.performRequest(:com.google.android.gms@17785040@17.7.85 (100700-253824076):13)
at com.android.volley.NetworkDispatcher.a(:com.google.android.gms@17785040@17.7.85 (100700-253824076):7)
at com.android.volley.NetworkDispatcher.run(:com.google.android.gms@17785040@17.7.85 (100700-253824076):2)
Caused by: rdg: 29503:
at rjf.a(:com.google.android.gms@17785040@17.7.85 (100700-253824076):4)
at aodi.b(:com.google.android.gms@17785040@17.7.85 (100700-253824076):2)
at aofv.a(:com.google.android.gms@17785040@17.7.85 (100700-253824076):6)
at aaew.run(:com.google.android.gms@17785040@17.7.85 (100700-253824076):30)
at bkng.run(:com.google.android.gms@17785040@17.7.85 (100700-253824076):2)
at skq.b(:com.google.android.gms@17785040@17.7.85 (100700-253824076):37)
at skq.run(:com.google.android.gms@17785040@17.7.85 (100700-253824076):21)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at sqo.run(Unknown Source:7)
at java.lang.Thread.run(Thread.java:919)
应用级分级
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.storeuncle.studyapp"
minSdkVersion 22
targetSdkVersion 28
versionCode 3
versionName "1.2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
// implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
//implementation 'com.google.firebase:firebase-messaging:17.3.4'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//implementation 'com.google.firebase:firebase-core:17.0.0'
// compile "me.leolin:ShortcutBadger:1.1.19@aar"
}
//apply plugin: 'com.google.gms.google-services'
顶级等级
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
// classpath 'com.google.gms:google-services:3.1.0'
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
最初的 pacakge 名称是 com.xyz.appname。起初我只更改了应用程序名称。它工作得很好。我将文件夹名称从 xyz 更改为其他名称。那就是这个错误弹出的时候。我只有一个包含所有代码的 java 文件。
任何文件中的任何行都没有错误。manifest 或 gradle 或任何其他文件。该应用程序一启动就崩溃了。有人可以帮我理解是什么原因造成的吗?这真的会让我很开心。谢谢你。
更新我的痛苦:-) 该应用程序停止崩溃。但是错误仍然存在。另请查看我为缓存浏览器 cookie 实现的代码。因为这也没有按预期工作。该网站在所有浏览器上都能正常工作。但在 webview 中,首次登录时加载的页面无法访问 cookie。它仅在第二次登录后获取 cookie。
public class MainActivity extends AppCompatActivity {
WebView mWebView;
private static final int INPUT_FILE_REQUEST_CODE = 1;
private static final int FILECHOOSER_RESULTCODE = 1;
private static final String TAG = MainActivity.class.getSimpleName();
private ValueCallback<Uri> mUploadMessage;
private Uri mCapturedImageURI = null;
private ValueCallback<Uri[]> mFilePathCallback;
private String mCameraPhotoPath;
Toolbar toolbar;
SharedPreferences sharedPref;
SwipeRefreshLayout swipeContainer;
CookieManager cookieManager;
String URLS = "https://xyz.co.in/zyx/panel/index.php";
int is_url = 0;
@RequiresApi(api = Build.VERSION_CODES.ECLAIR_MR1)
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sharedPref = getApplicationContext().getSharedPreferences("MyPref", 0);
mWebView = (WebView) findViewById(R.id.webView);
toolbar = (Toolbar) findViewById(R.id.toolbar);
swipeContainer = (SwipeRefreshLayout) findViewById(R.id.swipeContainer);
mWebView.setWebViewClient(new NewWebViewClient());
mWebView.setWebChromeClient(new ChromeClient());
mWebView.clearCache(false);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setAllowFileAccess(true);
webSettings.setLightTouchEnabled(true);
webSettings.setSupportZoom(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setAppCacheEnabled(true);
setSupportActionBar(toolbar);
cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
Intent intent = getIntent();
is_url = intent.getIntExtra("is_url", 0);
if (is_url == 1) {
URLS = intent.getStringExtra("url");
}
if (isNetworkConnected()) {
loadWebsite();
}
if (savedInstanceState == null) {
mWebView.post(new Runnable() {
@Override
public void run() {
loadWebsite();
}
});
}
}
private void loadWebsite() {
ConnectivityManager cm = (ConnectivityManager) getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
mWebView.loadUrl(URLS);
} else {
mWebView.setVisibility(View.GONE);
}
}
public class NewWebViewClient extends WebViewClient {
String uid="";
String pswd = "";
String exp="";
String usrnm = "";
String cookies ="";
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if(url.contains("login")){
// view.clearCache(true);
//view.clearHistory();
//view.clearFormData();
Log.i("Listener", "Start");
}
}
@RequiresApi(api = Build.VERSION_CODES.GINGERBREAD)
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
String cookies = cookieManager.getCookie(url);
Log.d(TAG, "All the cookies in a string:" + cookies);
try {
if (cookies == null) {
return;
}
String[] splitCookies = cookies.split(";");
for (String cookie : splitCookies) {
String[] cookieParts = cookie.split("=");
if (cookieParts.length > 0) {
String newCookie = cookieParts[0].trim() +
"=;expires=Sat, 1 Jan 2000 00:00:01 UTC;";
cookieManager.setCookie(url, newCookie);
}
}
uid = getCookie(url, "user_id");
pswd = getCookie(url, "login_string");
usrnm = getCookie(url, "username");
exp = getCookie(url, "exp");
if (uid != null && !uid.isEmpty()) {
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("user_id", uid);
editor.putString("login_string", pswd);
editor.putString("username", usrnm);
editor.putString("exp", exp);
// Log.e("4444 ", ss.toString());
editor.commit();
Log.v(TAG, "cook page fin:" + cookies);
}
}catch(Exception e){
}
if(url.contains("logout")){
Toast.makeText(MainActivity.this, "Logout successful", Toast.LENGTH_SHORT).show();
view.clearCache(true);
view.clearHistory();
view.clearFormData();
//sharedPref.edit().clear().apply();
Log.i("Listener", "Finish");
}
}
@Override
public void onLoadResource(WebView view, String url){
Log.v(TAG, "onLoadResource url: " + url);
String cookies = CookieManager.getInstance().getCookie(url);
}
public String getCookie(String siteName,String cookieName){
String CookieValue = null;
CookieManager cookieManager = CookieManager.getInstance();
String cookies = cookieManager.getCookie(siteName);
String[] temp=cookies.split(";");
for (String ar1 : temp ){
if(ar1.contains(cookieName)){
String[] temp1=ar1.split("=");
CookieValue = temp1[1];
break;
}
}
return CookieValue;
}
}
}
我可以看到 cookie 的日志如下
D/MainActivity: All the cookies in a string:PHPSESSID=p6puofnc250frclqh541cog5i6; user_id=4d236af1; username=Sachin; exp=2020-07-11; login_string=koko%40sert
V/MainActivity: cook page fin:PHPSESSID=p6puofnc250frclqh541cog5i6; user_id=4d236af1; username=Sachin; exp=2020-07-11; login_string=koko%40sert
解决方案
当您更改包名称时,您需要将其告知 google。当您更改文件夹名称时,它会更改您的包名称。你在使用谷歌服务吗?如果是,则打开您的谷歌帐户并在其中更新您的应用程序包名称。之后,下载新的 google-services.json 并将其替换为 app 文件夹下项目文件中现有的 google-services.json。
推荐阅读
- html - 在 html 标签中正确使用“隐藏”属性
- python - Mac osx python 看不到文件
- python-3.x - Python2.x/3.x 兼容性:“错误:AttributeError:‘Instruction’对象没有属性‘identity_byte’
- java - 如何返回不是实体的对象列表并添加一个自定义变量,该变量将从休眠查询中的属性文件中获取?
- javascript - Angular从html中的控件获取值
- c++ - 在多个对象中初始化预定义成员变量的正确方法是什么?
- google-chrome-extension - 从 devtools(自定义选项卡)到内容脚本的消息?
- loops - 似乎没有理由获得 NaN
- python-3.6 - 在 Raspbian Buster 上为非默认 python 制作 venv 时,mkvirtualenv 说“没有名为 distutils.spawn 的模块”
- vue.js - 使用计算的元素上的 vue 转换