微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

应用程序在 android 11 上崩溃:java.lang.ExceptionInInitializerError

如何解决应用程序在 android 11 上崩溃:java.lang.ExceptionInInitializerError

以下相同的代码在除 android 11 之外的所有 android 版本中都能完美运行。 在 android 11 或 API 30 中,我们的应用程序崩溃了,甚至根本无法打开。我们正在使用请求网络 API 在我们的应用中执行 GET、POST 操作。

这是一个日志:

--------- beginning of crash
2021-07-12 02:03:52.995 3158-3158/com.oryx.drives E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.oryx.drives,PID: 3158
    java.lang.ExceptionInInitializerError
        at okhttp3.internal.tls.CertificateChainCleaner$Companion.get(CertificateChainCleaner.kt:42)
        at okhttp3.OkHttpClient$Builder.sslSocketFactory(OkHttpClient.kt:718)
        at com.oryx.drives.RequestNetworkController.getClient(RequestNetworkController.java:77)
        at com.oryx.drives.RequestNetworkController.execute(RequestNetworkController.java:154)
        at com.oryx.drives.RequestNetwork.startRequestNetwork(RequestNetwork.java:45)
        at com.oryx.drives.MainActivity$15$1.run(MainActivity.java:277)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.IllegalStateException: Expected Android API level 21+ but was 30
        at okhttp3.internal.platform.Androidplatform$Companion.buildIfSupported(Androidplatform.kt:370)
        at okhttp3.internal.platform.Platform$Companion.findplatform(Platform.kt:204)
        at okhttp3.internal.platform.Platform$Companion.access$findplatform(Platform.kt:178)
        at okhttp3.internal.platform.Platform.<clinit>(Platform.kt:179)
        at okhttp3.internal.tls.CertificateChainCleaner$Companion.get(CertificateChainCleaner.kt:42) 
        at okhttp3.OkHttpClient$Builder.sslSocketFactory(OkHttpClient.kt:718) 
        at com.oryx.drives.RequestNetworkController.getClient(RequestNetworkController.java:77) 
        at com.oryx.drives.RequestNetworkController.execute(RequestNetworkController.java:154) 
        at com.oryx.drives.RequestNetwork.startRequestNetwork(RequestNetwork.java:45) 
        at com.oryx.drives.MainActivity$15$1.run(MainActivity.java:277) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
2021-07-12 02:03:53.421 3158-3158/com.oryx.drives I/Process: Sending signal. PID: 3158 SIG: 9

MainActivity.java :

package com.oryx.drives;

import android.animation.ObjectAnimator;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.util.TypedValue;
import android.view.View;
import android.view.animation.BounceInterpolator;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.dynamiclinks.FirebaseDynamicLinks;
import com.google.firebase.dynamiclinks.PendingDynamicLinkData;

import java.util.ArrayList;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

    private Timer _timer = new Timer();

    private String typeace = "";
    private String fontError = "";
    private String error = "";

    private LinearLayout linear1;
    private ImageView imageview1;
    private LinearLayout linear3;
    private LinearLayout linear4;
    private TextView textview3;
    private ImageView imageview2;
    private TextView textview2;

    private TimerTask timer;
    private Intent login = new Intent();
    private RequestNetwork rq;
    private RequestNetwork.RequestListener _rq_request_listener;
    private FirebaseAuth auth;
    private OnCompleteListener<Void> auth_updateEmailListener;
    private OnCompleteListener<Void> auth_updatePasswordListener;
    private OnCompleteListener<Void> auth_emailVerificationSentListener;
    private OnCompleteListener<Void> auth_deleteUserListener;
    private OnCompleteListener<Void> auth_updateProfileListener;
    private OnCompleteListener<AuthResult> auth_phoneAuthListener;
    private OnCompleteListener<AuthResult> auth_googleSignInListener;
    private OnCompleteListener<AuthResult> _auth_create_user_listener;
    private OnCompleteListener<AuthResult> _auth_sign_in_listener;
    private OnCompleteListener<Void> _auth_reset_password_listener;
    private ObjectAnimator anim = new ObjectAnimator();
    private AlertDialog.Builder d;
    private Intent i;



        @Override
        protected void onCreate (Bundle _savedInstanceState){
        super.onCreate(_savedInstanceState);
        setContentView(R.layout.main);
        com.google.firebase.FirebaseApp.initializeApp(this);

        initialize(_savedInstanceState);
        try{
            initializeLogic();
        }
        catch (Exception e){

            d.setMessage(e.getMessage());
            d.setIcon(R.drawable.warning);
            d.setPositiveButton("Report",new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface _dialog,int _which) {
                    i.setClass(getApplicationContext(),FeedbackActivity.class);
                    i.putExtra("error",getIntent().getStringExtra(e.getMessage()));
                    startActivity(i);
                }
            }); d.setCancelable(false);
            d.create().show();
        }
        getDynamicLinkFromFirebase();


        // checking if the uri is null or not.

    }

        private void getDynamicLinkFromFirebase () {
        FirebaseDynamicLinks.getInstance()
                .getDynamicLink(getIntent())
                .addOnSuccessListener(this,new OnSuccessListener<PendingDynamicLinkData>() {
                    @Override
                    public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
                        // Get deep link from result (may be null if no link is found)
                        Uri deepLink = null;
                        if (pendingDynamicLinkData != null) {
                            deepLink = pendingDynamicLinkData.getLink();
                        }


                        // Handle the deep link. For example,open the linked
                        // content,or apply promotional credit to the user's
                        // account.
                        // ...

                        // ...
                    }
                })

                .addOnFailureListener(this,new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {

                    }
                });
    }

        private void initialize (Bundle _savedInstanceState){

        linear1 = (LinearLayout) findViewById(R.id.linear1);
        imageview1 = (ImageView) findViewById(R.id.imageview1);
        linear3 = (LinearLayout) findViewById(R.id.linear3);
        linear4 = (LinearLayout) findViewById(R.id.linear4);
        textview3 = (TextView) findViewById(R.id.textview3);
        imageview2 = (ImageView) findViewById(R.id.imageview2);
        textview2 = (TextView) findViewById(R.id.textview2);
        rq = new RequestNetwork(this);
        auth = FirebaseAuth.getInstance();

        _rq_request_listener = new RequestNetwork.RequestListener() {
            @Override
            public void onResponse(String tag,String response) {
                final String _tag = tag;
                final String _message = response;

                if ((FirebaseAuth.getInstance().getCurrentUser() != null)) {
                    login.setClass(getApplicationContext(),HomeActivity.class);
                    login.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(login);
                    finish();
                } else {
                    login.setClass(getApplicationContext(),AppintroActivity.class);
                    login.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(login);
                    finish();
                }
            }

            @Override
            public void onErrorResponse(String _param1,String _param2) {
                final String _tag = _param1;
                final String _message = _param2;
                linear3.setVisibility(View.GONE);
                linear4.setVisibility(View.VISIBLE);
            }
        };

        auth_updateEmailListener = new OnCompleteListener<Void>() {
            @Override
            public void onComplete(Task<Void> _param1) {
                final boolean _success = _param1.isSuccessful();
                final String _errorMessage = _param1.getException() != null ? _param1.getException().getMessage() : "";

            }
        };

        auth_updatePasswordListener = new OnCompleteListener<Void>() {
            @Override
            public void onComplete(Task<Void> _param1) {
                final boolean _success = _param1.isSuccessful();
                final String _errorMessage = _param1.getException() != null ? _param1.getException().getMessage() : "";

            }
        };

        auth_emailVerificationSentListener = new OnCompleteListener<Void>() {
            @Override
            public void onComplete(Task<Void> _param1) {
                final boolean _success = _param1.isSuccessful();
                final String _errorMessage = _param1.getException() != null ? _param1.getException().getMessage() : "";

            }
        };

        auth_deleteUserListener = new OnCompleteListener<Void>() {
            @Override
            public void onComplete(Task<Void> _param1) {
                final boolean _success = _param1.isSuccessful();
                final String _errorMessage = _param1.getException() != null ? _param1.getException().getMessage() : "";

            }
        };

        auth_phoneAuthListener = new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(Task<AuthResult> task) {
                final boolean _success = task.isSuccessful();
                final String _errorMessage = task.getException() != null ? task.getException().getMessage() : "";

            }
        };

        auth_updateProfileListener = new OnCompleteListener<Void>() {
            @Override
            public void onComplete(Task<Void> _param1) {
                final boolean _success = _param1.isSuccessful();
                final String _errorMessage = _param1.getException() != null ? _param1.getException().getMessage() : "";

            }
        };

        auth_googleSignInListener = new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(Task<AuthResult> task) {
                final boolean _success = task.isSuccessful();
                final String _errorMessage = task.getException() != null ? task.getException().getMessage() : "";

            }
        };

        _auth_create_user_listener = new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(Task<AuthResult> _param1) {
                final boolean _success = _param1.isSuccessful();
                final String _errorMessage = _param1.getException() != null ? _param1.getException().getMessage() : "";

            }
        };

        _auth_sign_in_listener = new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(Task<AuthResult> _param1) {
                final boolean _success = _param1.isSuccessful();
                final String _errorMessage = _param1.getException() != null ? _param1.getException().getMessage() : "";

            }
        };

        _auth_reset_password_listener = new OnCompleteListener<Void>() {
            @Override
            public void onComplete(Task<Void> _param1) {
                final boolean _success = _param1.isSuccessful();

            }
        };
    }
        private void initializeLogic () {
        anim.setTarget(imageview1);
        anim.setPropertyName("translationY");
        anim.setFloatValues((float) (-500),(float) (0));
        anim.setDuration((int) (1500));
        anim.setInterpolator(new BounceInterpolator());
        anim.start();
        timer = new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        rq.startRequestNetwork(RequestNetworkController.GET,"https://www.google.com","A",_rq_request_listener);
                    }
                });
            }
        };
        _timer.schedule(timer,(int) (500));
        linear4.setVisibility(View.INVISIBLE);
    }

        @Override
        protected void onActivityResult ( int _requestCode,int _resultCode,Intent _data){

        super.onActivityResult(_requestCode,_resultCode,_data);

        switch (_requestCode) {

            default:
                break;
        }
    }

        @Deprecated
        public void showMessage (String _s){
        Toast.makeText(getApplicationContext(),_s,Toast.LENGTH_SHORT).show();
    }

        @Deprecated
        public int getLocationX (View _v){
        int _location[] = new int[2];
        _v.getLocationInWindow(_location);
        return _location[0];
    }

        @Deprecated
        public int getLocationY (View _v){
        int _location[] = new int[2];
        _v.getLocationInWindow(_location);
        return _location[1];
    }

        @Deprecated
        public int getRandom ( int _min,int _max){
        Random random = new Random();
        return random.nextInt(_max - _min + 1) + _min;
    }

        @Deprecated
        public ArrayList<Double> getCheckedItemPositionsToArray (ListView _list){
        ArrayList<Double> _result = new ArrayList<Double>();
        SparseBooleanArray _arr = _list.getCheckedItemPositions();
        for (int _iIdx = 0; _iIdx < _arr.size(); _iIdx++) {
            if (_arr.valueAt(_iIdx))
                _result.add((double) _arr.keyAt(_iIdx));
        }
        return _result;
    }

        @Deprecated
        public float getDip ( int _input){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,_input,getResources().getdisplayMetrics());
    }

        @Deprecated
        public int getdisplayWidthPixels () {
        return getResources().getdisplayMetrics().widthPixels;
    }

        @Deprecated
        public int getdisplayHeightPixels () {
        return getResources().getdisplayMetrics().heightPixels;
    }


}


RequestNetwork.java :

package com.oryx.drives;

import android.app.Activity;

import java.util.HashMap;

public class RequestNetwork {
private HashMap<String,Object> params = new HashMap<>();
private HashMap<String,Object> headers = new HashMap<>();

private final Activity activity;

private int requestType = 0;

public RequestNetwork(Activity activity) {
this.activity = activity;
}

public void setHeaders(HashMap<String,Object> headers) {
this.headers = headers;
}

public void setParams(HashMap<String,Object> params,int requestType) {
this.params = params;
this.requestType = requestType;
}

public HashMap<String,Object> getParams() {
return params;
}

public HashMap<String,Object> getHeaders() {
return headers;
}

public Activity getActivity() {
return activity;
}

public int getRequestType() {
return requestType;
}

public void startRequestNetwork(String method,String url,String tag,RequestListener requestListener) {
RequestNetworkController.getInstance().execute(this,method,url,tag,requestListener);
}

public interface RequestListener {
void onResponse(String tag,String response);
void onErrorResponse(String tag,String message);
}
}

RequestNetworkController.java :

package com.oryx.drives;

import com.google.gson.Gson;

import java.io.IOException;
import java.security.cert.CertificateException;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.x509trustmanager;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class RequestNetworkController {
public static final String GET      = "GET";
public static final String POST     = "POST";
public static final String PUT      = "PUT";
public static final String DELETE   = "DELETE";

public static final int REQUEST_ParaM = 0;
public static final int REQUEST_BODY  = 1;

private static final int SOCKET_TIMEOUT = 15000;
private static final int READ_TIMEOUT   = 25000;

protected OkHttpClient client;

private static RequestNetworkController mInstance;

public static synchronized RequestNetworkController getInstance() {
if(mInstance == null) {
mInstance = new RequestNetworkController();
}
return mInstance;
}

private OkHttpClient getClient() {
if (client == null) {
OkHttpClient.Builder builder = new OkHttpClient.Builder();

try {
final TrustManager[] trustAllCerts = new TrustManager[]{
new x509trustmanager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain,String authType)
throws CertificateException {
}

@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain,String authType)
throws CertificateException {
}

@Override
public java.security.cert.X509Certificate[] getAcceptedissuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};

final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null,trustAllCerts,new java.security.SecureRandom());
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
builder.sslSocketFactory(sslSocketFactory,(x509trustmanager) trustAllCerts[0]);
builder.connectTimeout(SOCKET_TIMEOUT,TimeUnit.MILLISECONDS);
builder.readTimeout(READ_TIMEOUT,TimeUnit.MILLISECONDS);
builder.writeTimeout(READ_TIMEOUT,TimeUnit.MILLISECONDS);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname,SSLSession session) {
return true;
}
});
} catch (Exception e) {
}

client = builder.build();
}

return client;
}

public void execute(final RequestNetwork requestNetwork,String method,final String tag,final RequestNetwork.RequestListener requestListener) {
Request.Builder reqBuilder = new Request.Builder();
Headers.Builder headerBuilder = new Headers.Builder();

if(requestNetwork.getHeaders().size() > 0) {
HashMap<String,Object> headers = requestNetwork.getHeaders();

for(HashMap.Entry<String,Object> header : headers.entrySet()) {
headerBuilder.add(header.getKey(),String.valueOf(header.getValue()));
}
}

try {
if (requestNetwork.getRequestType() == REQUEST_ParaM) {
if (method.equals(GET)) {
HttpUrl.Builder httpBuilder;

try {
httpBuilder = HttpUrl.parse(url).newBuilder();
} catch (NullPointerException ne) {
throw new NullPointerException("unexpected url: " + url);
}

if (requestNetwork.getParams().size() > 0) {
HashMap<String,Object> params = requestNetwork.getParams();

for (HashMap.Entry<String,Object> param : params.entrySet()) {
httpBuilder.addQueryParameter(param.getKey(),String.valueOf(param.getValue()));
}
}

reqBuilder.url(httpBuilder.build()).headers(headerBuilder.build()).get();
} else {
FormBody.Builder formBuilder = new FormBody.Builder();
if (requestNetwork.getParams().size() > 0) {
HashMap<String,Object> param : params.entrySet()) {
formBuilder.add(param.getKey(),String.valueOf(param.getValue()));
}
}

RequestBody reqBody = formBuilder.build();

reqBuilder.url(url).headers(headerBuilder.build()).method(method,reqBody);
}
} else {
RequestBody reqBody = RequestBody.create(okhttp3.MediaType.parse("application/json"),new Gson().toJson(requestNetwork.getParams()));

if (method.equals(GET)) {
reqBuilder.url(url).headers(headerBuilder.build()).get();
} else {
reqBuilder.url(url).headers(headerBuilder.build()).method(method,reqBody);
}
}

Request req = reqBuilder.build();

getClient().newCall(req).enqueue(new Callback() {
@Override
public void onFailure(Call call,final IOException e) {
requestNetwork.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
requestListener.onErrorResponse(tag,e.getMessage());
}
});
}

@Override
public void onResponse(Call call,final Response response) throws IOException {
final String responseBody = response.body().string().trim();
requestNetwork.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
requestListener.onResponse(tag,responseBody);
}
});
}
});
} catch (Exception e) {
requestListener.onErrorResponse(tag,e.getMessage());
}
}
}

请帮助我们解决错误。提前致谢:)

解决方法

那是 bug in OkHttp library,升级到至少 4.9.0 版本(最好是最新的)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。