تشخیص عدم اتصال به اینترنت
سلام دوستان
من یه برنامه دارم که برای گرفتن اطلاعاتش به اینترنت وصل می شه و طوری طراحی کردم که بدونه اتصال به اینترنت هم کار کنه. تنها مشکل این برنامه اینه که وقتی به اینترنت وصل نیستم برنامه کار نمی کنه. پس از جست و جو متوجه شدم که باید از BroadcastReceiver استفاده کنم.
حالا می خوام بدونم که استفاده از BroadcastReceiver برای رفع مشکل من صحیح است؟ و میشه کاری کنم که اگر به اینترنت متصل نیست کاری که من بهش می گم رو انجام بده؟ اگه آره بی زحمت کمی توضیح بدید.
تشکر
سلام داداش
میتونی از متد زیر که برات گذاشتم استفاده کنی
فقط باید پرمیژن چک اینترنت هم بهش بدی
خیلی راحت با یه 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; }
سلام
از این لینک میتونی کمک بگیری
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
این تابع کلاس 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 ، در غیر اینصورت پاسخ رو دریافت کردید ! ، لازم به ذکر هست که باید اتصال به اینترنت با دستوری مشابه سورس کد آقای یزادانی قبل از فراخوانی تابع چک بشه
بچه ها من از روش آقای یزدانی برای برسی اتصال به ابنترنت استفاده کردم و یه شرط 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; }
بی زحمت راهنمایی کنید که کجا رو اشتباه نوشتم.
از برنامه میاد بیرون می گه 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)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .