بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

تشخیص عدم اتصال به اینترنت

مدیریت گفتگو
hosseinAmini 12 سال پیش
آخرین تغییر: 12 سال پیش

سلام دوستان
من یه برنامه دارم که برای گرفتن اطلاعاتش به اینترنت وصل می شه و طوری طراحی کردم که بدونه اتصال به اینترنت هم کار کنه. تنها مشکل این برنامه اینه که وقتی به اینترنت وصل نیستم برنامه کار نمی کنه. پس از جست و جو متوجه شدم که باید از BroadcastReceiver استفاده کنم.
حالا می خوام بدونم که استفاده از BroadcastReceiver برای رفع مشکل من صحیح است؟ و میشه کاری کنم که اگر به اینترنت متصل نیست کاری که من بهش می گم رو انجام بده؟ اگه آره بی زحمت کمی توضیح بدید.
تشکر

نظرات

مجتبی یگانه 12 سال پیش
خوب دلیلی نداره از broadcast استفاده کنی ، کافیه وقتی آفلاینه درخواست به سرور نفرستی و از لوکال بخونی
hosseinAmini 12 سال پیش
مشکلم همین جاس که نمی دونم چه جوری تشخیص بدم که برنامه آفلاینه :) اگه راهنمایی کنی لطف کردی.
میتونی کانیزمی شبیه به پینگ سرور داشته باشی. به درخواست ثابت بفرستی و با گرفتن به جواب ثابت ارتباط با سرور رو چک کنی. این قضیه صرف کلاینت نیست. اگه سرور هم پاسخگو نباشه باز هم باید برنامه آفلاین کار کنه
hosseinAmini 12 سال پیش
egoldashraf جان اصلا متوجه نشدم :)) میشه یکم بیشتر توضیح بدی؟
شبیه سازی سیستم پینگ که معنیش اینه : ارسال یک درخواست به سرور حاوی یک پاسخ از سمت سرور باشه. مثلا اگه آدرس /hello رو رو سرور صدا زدی جواب hello از سمت سرور برگرده. قسمت دوم هم منظورم اینه که بفرض شما رو آندروید مطمئن شدی که ارتباط با اینترنت برقراره. این هرگز به معنی در دسترس بودن سرورت نیست. دسترسی به سرور رو باید مرجع قرار بدی نه ارتباط با اینترنتو
مجتبی یگانه 12 سال پیش
پاسخ آقای یزدانی صحیح هست و قبلا بارها و بارها پرسیده شده !
hosseinAmini 12 سال پیش
egoldashraf منظوره شما اینه که ابتدا یه درخواست به سرور بفرستم اگه پاسخ دریافت کردم یعنی ارتباط با سرور به درستی برقرار شده و در این صورت اطلاعاتی رو که میخوام از سرور بگیرم؟ خب با اینکار اگه پاسخی از سرور نگیرم بازم برنامه خطا میده. اگه به درستی متوجه نشدم اگر زحمتی نیست بگید. ممنون
خیر، منظور اینه که وجود ارتباط با اینترنت اگه برای شما ملاک قرار بگیره در تمام مواقعی که سرور پاسخگو نباشه برنامتون خطا میده - یعنی بعد از روش آقای یزدانی 100% همه چیز مهیا نیست! راهکار CreativeBoy برای چک کردن StatusCode هم به همین منظوره. خلاصه کلام اینه که سرور رو Live فرض نکنید
مجتبی یگانه 12 سال پیش
به این منظور باید بگم ، طبق سورس کدی که در آموزش ها هست ، ما مینونیم Response Code سرور رو بخونیم ، اما خیلی وقت ها نیازی نیست ، اگه سرور بعد زمانی خاصی پاسخگو نباشه ، به قسمت Catch میره ، اگه نباشه کرش میکنه ، کافیه تو این قسمت بگیم سرور پاسخ گو نیست ،حسین جان اگه نیاز بود بگو سورس بدم
hosseinAmini 12 سال پیش
آقای حسین زاده ممنونم از وقتی که گذاشتید.
hosseinAmini 12 سال پیش
مجتبی جان اگه سورس بدی که لطف کردی

پاسخ‌ها 5

یزدانی 12 سال پیش

سلام داداش 

میتونی از متد زیر که برات گذاشتم استفاده کنی

فقط باید پرمیژن چک اینترنت هم بهش بدی

خیلی راحت با یه if تو کدت مشکل حله اگه جاییشو متوجه نشدی بگو تا توضیح بدم !

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 public boolean isOnline() {
        ConnectivityManager cm =
                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        if (netInfo != null && netInfo.isConnectedOrConnecting()) {
            return true;
        }
        return false;
    }

نظرات

hosseinAmini 12 سال پیش
ممنون که پاسخ دادید. الان رفتم سراغ یه قسمت دیگه از برنامه. ایشالا وقتی این قسمت تموم شد حتما روش شما رو تست می کنم اگر هم مشکلی بود، اطلاع می دم. ممنون
CreativeBoy 12 سال پیش

سلام 

از این لینک میتونی کمک بگیری 

How to programmatically check availibilty of internet connection in Android?

من خودم یه کاری کردم بهت میگم شاید بدردت بخوره.

{ توی پروژه مارکت،توی کلاس DownloadRequest اومدم یه فیلد گذاشتم به اسم HttpStatusCode بعد یه متد getStatusCode براش گذاشتم (static بذاری بهتره) و توی متد دانلود بعد از ()connection.connect میتونی بنویسی، 

HttpStatusCode = connection.getResponseCode();

حالا هر جای پروژت خواستی ببینی که به این url ی که دادی میتونی متصل بشی یا نه به راحتی میتونی بررسی کنی که اگه 

DownloadRequest.getStatusCode() == 200;

بود یعنی با موفقیت به سایت وصل شدی else مثلا یه dialog باز میکنی میگی connection failed و از کاربر درخواست میکنی که مثلا wifi رو روشن کنه. }

تصحیح + عذر خواهی :| :

این که گفتم توی downloadRequest یه متد static  واسه گرفتن status کد بذاری رو کلا بی خیال (اشتباه بود ولی نمیدونم چرا بار اول که آزمایش کردم جواب داد، خلاصه بی دقتی از من بوده، ببخشید.) 

واسه بررسی این که ببینید اتصال موفقیت آمیزی به سرور داشتید با نه باید چنین متدی بنویسید

private int getConnectionStatus() {
        HttpClient client = new DefaultHttpClient();
        HttpGet method = new HttpGet("http://yoursite.com/");

        try {
            HttpResponse response = client.execute(method);
/**
توی این قسمت اگه ارتباط با موفقیت برقرار بشه عدد 200 برگردونده میشه
و هر جایی که نیاز داشته باشید میتونید خروجی این تابع رو بررسی کنید و از
برقرار بودن اتصال مطمئن بشید.
*/             return response.getStatusLine().getStatusCode();         }         catch (ClientProtocolException e) {             e.printStackTrace();         }         catch (IOException e) {             e.printStackTrace();         }         return 0;     }

 البته این روش همون طور که ALU گفتن، توی آموزش ها هست.

واسه روشن کردن wifi از تو برنامه هم میتونی به این صورت کار کنی: 

همین الان permission ها رو وارد کن تا یادت نرفته 

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

اینم طرز روشن کردن wifi توی برنامه:

package project;

import android.content.Intent;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import com.mysite.app.android_market.R;


public class ActivityStartup extends EnhancedActivity {

    WifiManager wm;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_startup);

        final TextView txtConTest = (TextView) findViewById(R.id.txtConTest);
        final Button btnWifi = (Button) findViewById(R.id.btnWifi);

        G.HANDLER.postDelayed(new Runnable() {

            @Override
            public void run() {
                if (DownloadRequest.getStatusCode() == 200) {
                    Intent intent = new Intent(G.currentActivity, ActivityApplicationsList.class);
                    G.currentActivity.startActivity(intent);
                    G.currentActivity.finish();
                } else {
                    txtConTest.setText("Connection Failed\nPlease check your internet connection");
                    btnWifi.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                            wm = (WifiManager) G.context.getSystemService(WIFI_SERVICE);
                            wm.setWifiEnabled(true);
                        }
                    });
                }

            }
        }, 3000);
    }
}

البته کد بالا یک نیاز به تغییر داره، باید به سلیقه خودت بگی که مثلا اگه به wifi وصل بود ولی به سایتت وصل نشد پس دکمه btnWifi رو نشون نده و یه پیغام دیگه نشون بده(همش دیگه میل خودته که چطور تغییرش بدی. :) )

اینم لینکش 

How to Enable/Disable Wifi or Internet Connection Programmatically

نظرات

hosseinAmini 12 سال پیش
واقعا عالی جوابتون مخصوصا اینکه لینک stack overflow رو دادید. امیدوارم بتونم زحمتاتون رو جبران کنم. ممنون
CreativeBoy 12 سال پیش
خواهش میکنم دوست عزیز، همین که به سوال شما جواب دادم باعث شد واسه پروژم یه ایده جالب به ذهنم بخوره، من باید از شما تشکر کنم ؛)
مجتبی یگانه 12 سال پیش

این تابع کلاس WebService  من هست ، که باهاش Source Code صفحه ی Web رو میخونم ،

 public class WebService {

    private static String inputstreamToString(InputStream inputStream) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder builder = new StringBuilder();

        try {
            String line;
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }

            return builder.toString();
        }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    public static String Getsource(String url, ArrayList<NameValuePair> params)
    {
        try {
            HttpClient client = new DefaultHttpClient();
            HttpPost method = new HttpPost(url);
            if (params != null)
            {
                method.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
            }
            HttpResponse result = client.execute(method);
            InputStream stream = result.getEntity().getContent();
            return inputstreamToString(stream);
        }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

به این شکل فراخوانی میشه :

 WebService.Getsource(String url, ArrayList<NameValuePair> params);

شما باید خروجی تابع رو در String ذخیره کنید ، اگه Null بشه ، یعنی سرور Down هست ، که رفته تو Catch ، در غیر اینصورت پاسخ رو دریافت کردید ! ، لازم به ذکر هست که باید اتصال به اینترنت با دستوری مشابه سورس کد آقای یزادانی قبل از فراخوانی تابع چک بشه

نظرات

hosseinAmini 12 سال پیش
ممنونم از کمکتون . الان یه سوال واسم پیش اومد ولی اول خودم چیزی که به ذهنم رسیده رو امتحان می کنم اگر به جواب نرسیدم بازم مزاحمتون می شم.
hosseinAmini 12 سال پیش

بچه ها من از روش آقای یزدانی برای برسی اتصال به ابنترنت استفاده کردم و یه شرط if گذاشتم که اگه true بود متدی که به کلاس وب سرویس آدرس سایت رو می فرسته اجرا بشه.
کدش رو میزارم ببینید اصلا درست نوشتم؟
این قسمتی هست که چک می کنم که اگه مقداره online درست بود متده getImageFromInternet(این متد به webservice آدرس سایت رو می فرسته) اجراشه. 

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        GridView grid = (GridView) findViewById(R.id.grid);
        Button btnFav = (Button) findViewById(R.id.btnFav);
        Button btnCategories = (Button) findViewById(R.id.btnCategories);

        adapter = new AdapterImages(G.images);
        grid.setAdapter(adapter);
        boolean online = isOnline();
        if (online) {
            getImageFromInternet();
        } else {
            Toast.makeText(G.context, "No Internet", Toast.LENGTH_SHORT).show();
        }
}

 این هم متدی هست که آقای یزدانی دادند:

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

بی زحمت راهنمایی کنید که کجا رو اشتباه نوشتم.

نظرات

hosseinAmini 12 سال پیش
ولی کار نمی کنه :D توو کلاس وب سرویس هم کدی که شما داید رو نوشتم ولی خب مشکل از اون نیست چون وقتی به اینترنت وصل می شم درست کار می کنه.
hosseinAmini 12 سال پیش
تا همینجاشم لطف کردی، یکم باهش ور میرم ببنیم درست میشه. ممنون
یزدانی 12 سال پیش
پرمیژن رو تو منیفست اضافه کردید ؟؟؟
یزدانی 12 سال پیش
داداش مستقیم isOnline() بده به if ببین جواب نمیده؟ خطا چی میده؟؟
hosseinAmini 12 سال پیش

از برنامه میاد بیرون می گه unfortunetly imageGarllery has stoped 
لوگ:

 FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{ir.hosseinamini.course.app.my_imageoptimizatio2/ir.hosseinamini.course.app.my_imageoptimizatio2.ActivityStartup}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
at org.json.JSONTokener.nextValue(JSONTokener.java:94)
at org.json.JSONArray.<init>(JSONArray.java:87)
at org.json.JSONArray.<init>(JSONArray.java:103)
at ir.hosseinamini.course.app.my_imageoptimizatio2.ActivityStartup.getImageFromInternet(ActivityStartup.java:97)
at ir.hosseinamini.course.app.my_imageoptimizatio2.ActivityStartup.onCreate(ActivityStartup.java:53)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
... 11 more
problem reading network stats
java.lang.IllegalStateException: problem parsing idx 1
at com.android.internal.net.NetworkStatsFactory.readNetworkStatsDetail(NetworkStatsFactory.java:300)
at com.android.internal.net.NetworkStatsFactory.readNetworkStatsDetail(NetworkStatsFactory.java:250)
at com.android.internal.os.BatteryStatsImpl.getNetworkStatsDetailGroupedByUid(BatteryStatsImpl.java:5734)
at com.android.internal.os.BatteryStatsImpl.access$100(BatteryStatsImpl.java:76)
at com.android.internal.os.BatteryStatsImpl$Uid.computeCurrentTcpBytesReceived(BatteryStatsImpl.java:2457)
at com.android.internal.os.BatteryStatsImpl$Uid.getTcpBytesReceived(BatteryStatsImpl.java:2446)
at com.android.internal.os.BatteryStatsImpl.writeSummaryToParcel(BatteryStatsImpl.java:5437)
at com.android.internal.os.BatteryStatsImpl.writeLocked(BatteryStatsImpl.java:4836)
at com.android.internal.os.BatteryStatsImpl.writeAsyncLocked(BatteryStatsImpl.java:4818)
at com.android.server.am.ActivityManagerService.updateCpuStatsNow(ActivityManagerService.java:1652)
at com.android.server.am.ActivityManagerService$3.run(ActivityManagerService.java:1534)
Caused by: java.io.FileNotFoundException: /proc/net/xt_qtaguid/stats: open failed: ENOENT (No such file or directory)
at libcore.io.IoBridge.open(IoBridge.java:406)
at java.io.FileInputStream.<init>(FileInputStream.java:78)
at com.android.internal.net.NetworkStatsFactory.readNetworkStatsDetail(NetworkStatsFactory.java:269)
... 10 more
Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
at libcore.io.Posix.open(Native Method)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
at libcore.io.IoBridge.open(IoBridge.java:390)
... 12 more

 

این خط دقیقا به داخل if که گفتیم اگه اینترنت وصل بود متده getImageFromInternet اجرا شه اشاره می کنه.

at ir.hosseinamini.course.app.my_imageoptimizatio2.ActivityStartup.onCreate(ActivityStartup.java:53)

 

نظرات

hosseinAmini 12 سال پیش
آقای یزدانی درست شد، توو emulator خراب کار می کرد ریختم توو تبلت درست کار می کنه. ممنون

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .