آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

hosseinAmini  9 سال پیش  9 سال پیش
+6 0

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

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

سلام داداش 

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

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

خیلی راحت با یه 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;
    }

0 0
ممنون که پاسخ دادید. الان رفتم سراغ یه قسمت دیگه از برنامه. ایشالا وقتی این قسمت تموم شد حتما روش شما رو تست می کنم اگر هم مشکلی بود، اطلاع می دم. ممنون (9 سال پیش)
پاسخ به سوال 
CreativeBoy  9 سال پیش
+7 0

سلام 

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

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

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

این تابع کلاس 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 ، در غیر اینصورت پاسخ رو دریافت کردید ! ، لازم به ذکر هست که باید اتصال به اینترنت با دستوری مشابه سورس کد آقای یزادانی قبل از فراخوانی تابع چک بشه

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

بچه ها من از روش آقای یزدانی برای برسی اتصال به ابنترنت استفاده کردم و یه شرط 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;
    }

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

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

از برنامه میاد بیرون می گه 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)

 

0 0
آقای یزدانی درست شد، توو emulator خراب کار می کرد ریختم توو تبلت درست کار می کنه. ممنون (9 سال پیش)
0 0
خداروشکر (9 سال پیش)

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