تشکر
پس کدهای من درستن فقط باید اینو اضافه کنم درسته ؟
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// READ_PHONE_STATE permission is granted
} else {
// READ_PHONE_STATE permission is denied
}
break;
}
}
و اینکه استاد یک سوال
میشه کاری کرد که هر موقعی که اینترنت گوشی خاموش شد برنامه بسته بشه ؟
بله همینطوره. درمورد سؤال دومتون هم میتونین در فواصل زمانی مشخصی با کلاس Timer یا Executor چک کنید اینترنت هنوز وصل هست یا نه و اگه جواب متد isOnline منفی بود (false) اونوقت برنامه رو با دستور System.exit(0); ببندین.
سلام
استاد ببخشید من هرکاری کردم روی نسخه های بالای اندروید درست نشد
روی نسخه 4 و 5 تست کردم درسته و وقتی اینترنت وصل نباشه اکتیویتی که گذاشتم اجرا میشه و پیام میده که اینترنت وصل نیست
اما روی نسخه بالا هیچ اتفاقی نمیفته
سلام
استاد تو گروه گفتید که کدهامو بزارم برای چک کردن اینترنت گوشی که اگر خاموش بود اکتیویتی که ساختم به اسم khata رو نشون بده
این کدهای کامل مین اکتیویتی من :
package ir.payamdev.student;
import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.internal.BottomNavigationItemView;
import android.support.design.widget.BottomNavigationView;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;
import java.io.IOException;
import static android.content.ClipData.newIntent;
import static ir.payamdev.student.R.id.activity_khata;
public class MainActivity extends AppCompatActivity implements
BottomNavigationView.OnNavigationItemSelectedListener {
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
private GoogleApiClient client;
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;
}
private WebView webView;
private ColorStateList myColorStateList = new ColorStateList(
new int[][]{
new int[]{android.R.attr.state_checked}, // checked
new int[]{-android.R.attr.state_checkable}// unchecked
}, new int[]{
Color.parseColor("#FFFF4081"),
Color.parseColor("#FF880E4F")
});
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// READ_PHONE_STATE permission is granted
} else {
// READ_PHONE_STATE permission is denied
}
break;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
if (!isOnline()) {
Intent intent = new Intent(MainActivity.this,khata.class);
startActivity(intent);
finish();
}
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();
}
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView);
webView.loadUrl(getString(R.string.link_about));
BottomNavigationView navigation = (BottomNavigationView)
findViewById(R.id.navigation);
navigation.setItemIconTintList(myColorStateList);
navigation.setItemTextColor(myColorStateList);
navigation.setOnNavigationItemSelectedListener(this);
navigation.setSelectedItemId(R.id.navigation_about);
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// Code to run when page loading starts
}
@Override
public void onPageFinished(WebView view, String url) {
// Code to run when page loading finished
}
});
webView.getSettings().setJavaScriptEnabled(true);
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_profile:
webView.loadUrl(getString(R.string.link_profile));
return true;
case R.id.navigation_lesson:
webView.loadUrl(getString(R.string.link_Lesson));
return true;
case R.id.navigation_description:
webView.loadUrl(getString(R.string.link_description));
return true;
case R.id.navigation_download:
webView.loadUrl(getString(R.string.link_download));
return true;
case R.id.navigation_about:
webView.loadUrl(getString(R.string.link_about));
return true;
}
return false;
}
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
public Action getIndexApiAction() {
Thing object = new Thing.Builder()
.setName("Main Page") // TODO: Define a title for the content shown.
// TODO: Make sure this auto-generated URL is correct.
.setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
.build();
return new Action.Builder(Action.TYPE_VIEW)
.setObject(object)
.setActionStatus(Action.STATUS_TYPE_COMPLETED)
.build();
}
@Override
public void onStart() {
super.onStart();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client.connect();
AppIndex.AppIndexApi.start(client, getIndexApiAction());
}
@Override
public void onStop() {
super.onStop();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
AppIndex.AppIndexApi.end(client, getIndexApiAction());
client.disconnect();
}
}
الان تو نسخه اندروید 6 به پایین کار میکنه ولی روی 6 هیچ اتفاقی نمیفته
میخوام اگر اینترنت گوشی کاربر متصل نبود اکتیویتی که ساختم به اسم khata نشون بده و بقیه کدها اجرا نشن
چون برنامه طوری هست که صفحه اول برنامه یک آدرس سایت رو لود میکنه و اگر اینترنت وصل نباشه خطاهای داخل سایت رو نشون میده که زشته
کلا میخوام وقتی اینترنت گوشی وصل نباشه برنامه کار نکنه و خطا بده
متد onRequestPermissionResult رو اینطوری تغییر بدین:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (!isOnline()) {
Intent intent = new Intent(MainActivity.this, khata.class);
startActivity(intent);
finish();
}
} else {
Toast.makeText(MainActivity.this, "Permission Denied! Exitting...");
MainActivity.this.finish();
}
break;
}
}
و توی onCreate هم اینطوری بنویسید:
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();
}
}
ضمناً وقتی یکبار با if نوشتین لازم نیست بدون اون هم دوباره اینترنت رو چک کنید (الان توی onCreate یکبار معمولی isOnline رو صدا زدین و یکبار با if که لازم نیست). درواقع توی دستگاههای قبل از اندروید 6 همینکه توی مانیفست معرفی کرده باشین مجوز رو، بهمعنای PERMISSION_GRANTED هست و قسمت else اجرا میشه.
تشکر استاد
الان همه چی درسته
فقط اینکه اگر برنامه باز باشه و اینترنت قطع بشه صفحات خطا میاد
میشه برنامه همیشه متکی به وصل بودن اینترنت باشه ؟ و اگر هر زمانی اینترنت گوشی قطع شد برنامه هم بسته بشه ؟
بله میشه. میتونین با کمک Timer یا Executor در فواصل زمانی مشخصی اتصال اینترنت رو با isOnline چک کنین و هروقت false برگردوند، اکتیویتی رو با finish ببندین یا کلاً برنامه رو با چنین کدی خاتمه بدین:
Toast.makeText(this, "No internet connection", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
System.exit(0);
}
}, 2000);
توضیح: اون دو ثانیه تأخیر برای اینه که Toast کامل دیده بشه و بعد برنامه بسته بشه.
تشکر استاد
الان عدد 2000 تو این کد مشخص میکنه که هرچندثانیه چک کنه ؟
یعنی هر 2 ثانیه یا 20 ثانیه ؟
یا این عدد برای مدت نمایش پیامه ؟
2000 یعنی 2 ثانیه (برحسب میلیثانیه است). مدتزمان تقریبی نمایش کوتاه Toast دو ثانیه است.
تشکر
استاد من این شکلی گذاشتم اما کار نکرد
Timer networkTimer = new Timer();
NetWorkTimerTask networkTimerTask = new NetWorkTimerTask();
networkTimer.schedule(networkTimerTask, 0,40*1000);
public class NetWorkTimerTask extends TimerTask {
@Override
public void run() {
networkHandler.sendEmptyMessage(0);
}
};
@SuppressLint("HandlerLeak")
Handler networkHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
isOnline = isOnline(getApplicationContext());
}
};
خوب این روش اشتباهه. دقت کنید که توی اندروید دو تا کلاس Handler وجود داره (یکی توی پکیج android.os هست و یکی دیگه توی خود جاوا). مراقب باشین که کلاس درست رو Import کرده باشین. الان شما کلاس جاوا رو ایمپورت کردین. کلاس اندروید موقع ساخت شئ جدید نیاز به رونویسی متدی نداره.
تشکر
از کجا میتونم ببینم که کلاس جاوا هست یا اندروید ؟
کدم رو به این شکل تغییر دادم ببینید درسته :
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (!isOnline()) {
Intent intent = new Intent(MainActivity.this,khata.class);
startActivity(intent);
finish();
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
} else {
if (!isOnline()) {
Intent intent = new Intent(MainActivity.this, khata.class);
startActivity(intent);
finish();
}
}
//Toast.makeText(getApplicationContext(), "اینترنت وصل نیست", Toast.LENGTH_LONG).show();
}
});
}
},0,5000);
قسمت importها رو در بالای فایل کدتون نگاه کنید. اگه اشتباه ایمپورت شده، خط مربوط به Handler رو پاک کنید و دستور صحیح رو بنویسید:
import android.os.Handler;
با اینکار میتونین شئ Handler رو با کدی مثل زیر ایجاد کنید:
Handler handler = new Handler();
تشکر
استاد الان درست شد کد من به این شکله و درست کار میکنه :
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (!isOnline()) {
Intent intent = new Intent(MainActivity.this,khata.class);
startActivity(intent);
finish();
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
} else {
if (!isOnline()) {
Intent intent = new Intent(MainActivity.this, khata.class);
startActivity(intent);
finish();
}
}
//Toast.makeText(getApplicationContext(), "اینترنت وصل نیست", Toast.LENGTH_LONG).show();
}
});
}
},0,7000);
هر 7 ثانیه چک میکنه
اما یه مشکل هست اینکه :
برنامرو باز میکنی اینترنت وصل نباشه اکتیویتی خطا میاد حالا برنامرو که میبندی و خارج میشی 7 ثانیه بعد به صورت خودکار برنامه دوباره اجرا میشه !
یعنی حتی وقتی برنامرو میبندی باز دوباره خود به خود اجرا میشه !
برنامه رو با کد زیر توی اکتیویتیهاتون ببندین:
@Override
public void onBackPressed() {
System.exit(0);
}