没有互联网连接时应用崩溃

时间:2016-02-26 15:06:29

标签: android amazon-web-services amazon-s3 amazon-cognito

我正在开发一个Android项目,用户尝试将其文件上传到AWS S3。开发人员身份验证使用AWS Cognito完成。所以这里的过程是在用户尝试将文件上传到S3之前,用户必须使用AWS Cogntio获取凭据。然后用户上传文件。当用户选择文件并单击“确定”时,此过程在后台进行。如果互联网可用,一切都会好起来的。否则应用程序崩溃。 这是代码的一部分。

此处Auth类扩展了AWSAbstractCognitoDeveloperIdentityProvider。

     Auth developerProvider = new Auth(
                    null,
                    "ap-northeast-1:a871fa5f-2-480d-baa6-b4ed31437244",
                    Regions.AP_NORTHEAST_1);

     CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                    this.ctx.getApplicationContext(),
                    developerProvider,
                    Regions.AP_NORTHEAST_1);

            HashMap<String, String> loginsMap = new HashMap<String, String>();
            loginsMap.put("login.cool.app", "7386872");
            credentialsProvider.setLogins(loginsMap);
            credentialsProvider.refresh();

应用程序在此行崩溃

           credentialsProvider.refresh();

显示错误:

        I/AmazonHttpClient: Unable to execute HTTP request: Unable to resolve host "cognito-identity.ap-northeast-1.amazonaws.com": No address associated with hostname
                                               java.net.UnknownHostException: Unable to resolve host "cognito-identity.ap-northeast-1.amazonaws.com": No address associated with hostname
                                                   at java.net.InetAddress.lookupHostByName(InetAddress.java:427)
                                                   at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
                                                   at java.net.InetAddress.getAllByName(InetAddress.java:215)
                                                   at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29)
                                                   at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)
                                                   at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)
                                                   at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)
                                                   at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
                                                   at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)
                                                   at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
                                                   at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:217)
                                                   at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
                                                   at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25)
                                                   at com.amazonaws.http.UrlHttpClient.writeContentToConnection(UrlHttpClient.java:128)
                                                   at com.amazonaws.http.UrlHttpClient.execute(UrlHttpClient.java:65)
                                                   at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:353)
                                                   at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:196)
                                                   at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.invoke(AmazonCognitoIdentityClient.java:533)
                                                   at com.amazonaws.services.cognitoidentity.AmazonCognitoIdentityClient.getCredentialsForIdentity(AmazonCognitoIdentityClient.java:406)
                                                   at com.amazonaws.auth.CognitoCredentialsProvider.populateCredentialsWithCognito(CognitoCredentialsProvider.java:627)
                                                   at com.amazonaws.auth.CognitoCredentialsProvider.startSession(CognitoCredentialsProvider.java:553)
                                                   at com.amazonaws.auth.CognitoCredentialsProvider.refresh(CognitoCredentialsProvider.java:503)
                                                   at com.amazonaws.auth.CognitoCachingCredentialsProvider.refresh(CognitoCachingCredentialsProvider.java:462)
                                                   at com.amazonaws.auth.CognitoCachingCredentialsProvider.getIdentityId(CognitoCachingCredentialsProvider.java:413)
                                                   at com.amazonaws.auth.CognitoCredentialsProvider.populateCredentialsWithCognito(CognitoCredentialsProvider.java:620)
                                                   at com.amazonaws.auth.CognitoCredentialsProvider.startSession(CognitoCredentialsProvider.java:553)
                                                   at com.amazonaws.auth.CognitoCredentialsProvider.refresh(CognitoCredentialsProvider.java:503)
                                                   at com.amazonaws.auth.CognitoCachingCredentialsProvider.refresh(CognitoCachingCredentialsProvider.java:462)
                                                   at com.example.sandesh.filer.UpDown.upload.doInBackground(upload.java:89)
                                                   at com.example.sandesh.filer.UpDown.upload.doInBackground(upload.java:27)
                                                   at android.os.AsyncTask$2.call(AsyncTask.java:292)
                                                   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                                                   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                   at java.lang.Thread.run(Thread.java:818)

有没有尝试抓住它?或任何解决方案,以避免崩溃?

谢谢。

3 个答案:

答案 0 :(得分:2)

在我的应用中实施支票后,查看是否有任何互联网连接。您可以查看此内容并决定是否要实现此目的。

public class ConnectionDetector {

    private Context context;

    public ConnectionDetector(Context cont) {
        this.context = cont;
    }

    public boolean isConnectingToInternet() {
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null) {
                for (int i = 0; i < info.length; i++) {
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        return true;
                    }
                }
            }

        }
        return false;
    }
}

您可以在OnCreate方法中初始化此类的对象。

最后打电话给这个班级&#39;在您上传文件之前的方法。

ConnectionDetector connectionDetector = new ConnectionDetector(mContext);
Boolean isInternetConnected = connectionDetector.isConnectingToInternet();

if (isInternetConnected) {
    //Do your stuff
} else {

    Toast.makeText(mContext, "Please Check Your Internet Connection", Toast.LENGTH_LONG).show();
}

希望这有帮助。

答案 1 :(得分:2)

经过多次努力,我想到了。由于互联网连接低和弱,导致问题。虽然应用程序连接到互联网,但这不是一个活跃的互联网连接。无法访问。所以我通过检查应用程序是否连接到互联网并通过ping google.com查找是否可以访问互联网来解决问题。谢谢。

       public class internetchek extends AsyncTask<Void,Void,Void> {

public boolean connection;
Context ctx;
public internetchek(Context context){
    this.ctx = context;
}
public internetchek(){

}
@Override
protected void onPreExecute() {
    super.onPreExecute();
}

@Override
protected Void doInBackground(Void... params) {

    if(isNetworkAvailable(this.ctx))
    {

     Log.d("NetworkAvailable","TRUE");
        if(connectGoogle())
        {

            Log.d("GooglePing","TRUE");
            connection=true;
        }
        else
        {

            Log.d("GooglePing","FALSE");
            connection=false;
        }
    }
    else {

        connection=false;
    }


    return null;
}

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
}

public static boolean isNetworkAvailable(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnected()) {
        return true;
    }
    return false;
}

public static boolean connectGoogle() {
    try {
        HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
        urlc.setRequestProperty("User-Agent", "Test");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(10000);
        urlc.connect();
        return (urlc.getResponseCode() == 200);

    } catch (IOException e) {

        Log.d("GooglePing","IOEXCEPTION");
        e.printStackTrace();
        return false;
    }
}

}

答案 2 :(得分:0)

您可以使用try / catch包围代码。

try {
    //your code
} catch(Exception e) { 
Toast.makeText(getApplicationContext(), "Error connecting to network.", Toast.LENGTH_SHORT).show();
}

但是,在执行代码之前进行网络检查可以防止不必要的代码运行。