رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
چک کردن اینترنت گوشی کاربر در برنامه
#1
سلام و خسته نباشید


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

الان یک برنامه ساده نوشتم و میخوام وقتی برنامه اجرا میشه قبل از هر چیزی چک بشه که اگر اینترنت گوشی روشن نبود برنامه اجرا نشه و خطا بده که مثلا اینترنت گوشی خاموش است

دسترسی رو در فایل AndroidManifest.xml با این کد اضافه کردم نمیدونم درسته یا نه :


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


ممنون
پاسخ
تشکر شده توسط:
#2
با این متد میتونین چک کنین که به اینترنت وصل هست یا نه:
public static boolean isOnline() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if (networkInfo == null || !networkInfo.isConnected()) {
        return false;
    }
    try {
        Process ipProcess = Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8");
        if (ipProcess.waitFor() != 0) {
            return false;
        }
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
    return true;
}
پاسخ
تشکر شده توسط: elham
#3
توضیح: 8.8.8.8 آدرس IP گوگل هست و با دستور ping چک میکنیم که جواب از سایت گوگل میاد یا نه. خیلی وقتها WiFi یا GPRS دستگاه وصله (به شبکه متصله) ولی اینترنت نداره و برای همین پینگ میگیریم که معتبرترین سایت برای چک‌کردن، گوگله.
پاسخ
تشکر شده توسط: elham
#4
تشکر استاد
این کد رو توی مین فست بزارم دیگه ؟

بعد اینکه میشه اگر اینترنتش وصل نبود یه آلرت بده روی صفحه گوشی که اینترنت شما وصل نیست ؟
پاسخ
تشکر شده توسط:
#5
خیر این رو توی MainActivity بگذارین. خروجی این متد boolean هست و میتونین چک کنین اگه خروجی false داد هر کاری که لازم دارین انجام بدین. برای مثال:
if (!isOnline()) {
    Toast.makeText(this, "Internet connection failed.", Toast.LENGTH_LONG).show();
}
پاسخ
تشکر شده توسط: elham
#6
توی مانیفست هم این مجوزها رو بدین:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
پاسخ
تشکر شده توسط: elham
#7
البته در اندروید 6 و بالاتر برای خوندن وضعیت تلفن باید مجوز رو بصورت Runtime بگیرین. این تاپیک رو حتماً مطالعه کنید.
پاسخ
تشکر شده توسط: elham
#8
تشکر

الان من همین کدهارو استفاده کردم و روی شبیه ساز درست کار کرد و روی گوشی نسخه 4 به بالا تست کردم کار کرد
اما نسخه 6 به بالا تست نکردم
اون تاپیک رو هم خوندم متوجه نشدم
همین کدهارو چطوری باید بهصورت رانتایم گذاشت ؟
پاسخ
تشکر شده توسط:
#9
توی تاپیک توضیح دادم. برای مجوزهایی که امن نیستن (مثل READ_PHONE_STATE)، باید بصورت Runtime مجوز رو درخواست کنین و توی onActivityResult چک کنین که مجوز داده شده یا نه.
پاسخ
تشکر شده توسط: elham
#10
تشکر

الان کد من به این شکله که خودتون دادین :

public boolean isOnline() {
    ConnectivityManager connectivityManager;
    connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if (networkInfo == null || !networkInfo.isConnected()) {
        return false;
    }
    try {
        Process ipProcess = Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8");
        if (ipProcess.waitFor() != 0) {
            return false;
        }
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
    return true;
}


و داخل onCreate با این چک میکنم که هست یا نه :

if (!isOnline()) {
    Toast.makeText(this, "اینترنت گوشی خاموش است.", Toast.LENGTH_LONG).show();
    finish();
}


الآن باید کدهامو تغییر بدم به این شکل ؟

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
}
پاسخ
تشکر شده توسط:
#11
بله. درواقع باید هرجا به این مجوز احتیاج دارین، این if رو بگذارین و توی قسمت else (که باید بهش اضافه کنین) دستوراتی که به اون مجوز احتیاج دارن رو بنویسین. یعنی اینکه دارین چک میکنین اگه مجوز مربوطه وجود نداشته باشه، درخواستش رو میده و اگه وجود داشته باشه، دستوراتتون رو اجرا کنین.
پاسخ
تشکر شده توسط: elham
#12
تشکر استاد
من به ترتیب میگم ببینید درست انجام دادم :

شرط قبلی من این بود که درست کار میکنه


if (!isOnline()) {
    Intent intent = new Intent(MainActivity.this, khata.class);
    startActivity(intent);
    finish();
}




حالا گفتید این فقط در اندروید 6 به پایین کار میکنه

پس برای اندروید 6 به باید این کارو کنم :

اول کلاس رو ایجاد میکنیم :

public boolean isOnline() {
    ConnectivityManager connectivityManager;
    connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    if (networkInfo == null || !networkInfo.isConnected()) {
        return false;
    }
    try {
        Process ipProcess = Runtime.getRuntime().exec("/system/bin/ping -c 1 8.8.8.8");
        if (ipProcess.waitFor() != 0) {
            return false;
        }
    } catch (IOException | InterruptedException e) {
        e.printStackTrace();
    }
    return true;
}

برای درخواست :


if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
} else {
    if (!isOnline()) {
        Intent intent = new Intent(MainActivity.this, khata.class);
        startActivity(intent);
        finish();
    }
}



و این که استاد الان این روش روی همه نسخه ها جواب میده یا فقط اندروید 6 به بالا ؟
یعنی برای 6 باید اینو استفاده کنیم و 6 به پایین همون روش قبلی ؟

یعنی برای همه نسخه ها باید هر دو تارو استفاده کنیم یا همون روش 6 رو بزاریم کافیه ؟
پاسخ
تشکر شده توسط:
#13
بله الان درست نوشتین و فقط باید onRequestPermissionsResult رو هم اضافه کنین و اونجا چک کنین که مجوز داده شده یا نه و بعد از اینکه مجوز داده شد، کاری که قرار بود انجام بشه رو فراخوانی کنین یا بگذارین کاربر دوباره روی دکمه‌ی مربوطه بزنه.

برای اندروید قبل از 6 کاری لازم نیست انجام بدین و همین‌که مجوزها رو توی Manifest اعلام کنید کافیه و اون شرطی که گذاشتین همیشه false برمیگردونه (وضعیت مجوز مخالف PERMISSION_GRANTED نیست) و این‌کار برای اجرا روی اندروید 6 و بالاتر باید انجام بشه.
پاسخ
تشکر شده توسط: elham
#14
تشکر

ببخشید استاد این onRequestPermissionsResult رو متوجه نشدم
میشه در موردش بگین که چی هست و کجا باید اضافه کنم
پاسخ
تشکر شده توسط:
#15
توی همون تاپیک که لینکش رو گذاشتم توضیح دادم. موقعی که کاربر روی Allow یا Deny توی پنجره‌ی درخواست مجوز کلیک کنه، این متد فراخوانی میشه و نتیجه‌ی درخواست مجوز رو میتونین متوجه بشین.
پاسخ
تشکر شده توسط: elham




کاربران در حال بازدید این موضوع: 1 مهمان