ارسال پست به webview در اندروید
یکی از پرکاربردترین ابزارهای مورد استفاده در اندروید استودیو ، webview است ، که امکان استفاده از صفحات وب را در محیط اندروید فراهم ساخته است. از این رو ، با استفاده از ویژگی های موجود برای مدیریت این صفحات در محیط اندروید می توان بدون اتلاف وقت، برنامه ها را به حداکثر کارایی رساند. در مثالی که برایتان توضیح خواهیم داد درخواهید یافت که چگونه با اندکی خلاقیت می توان بدون صرف وقت و انرژی به اهداف مورد نظر خود دست یافت. مثال ما از لحاظ ساختار جنبه های آموزشی بسیاری دارد و لیکن تاکید ما بر روی یک موضوع از باب اهمیت بارز آن موضوع است از این رو در این آموزش افزون بر یادگیری موضوع اصلی مقاله یعنی نحوه پست کردن اطلاعات به صفحات وب در داخل خود برنامه، می توان به آموزش فراخوری همچون برنامه نویسی تنظیمات مربوط به وب ویو، progress bar و … دست یافت.البته لازم به ذکر است که برای بهره گیری بیشتر از آموزش، آشنایی با زبان php و نوشتن برنامه سمت سرور برای دریافت requestبرنامه ها ضروری است. البته لازم نیست زیاد نگران باشید چراکه همگام با اموزش برنامه نویسی اندروید می توانید زبان به php را یاد بگیرد.
پروژه جدیدی را در اندروید استودیو یا اکلیپس ایجاد کنید
اکلیپس :File ⇒ New Android ⇒ Application Project
اندروید استودیو :File ⇒ New ⇒ New Project
نام اکتیویتی ابتدایی و اصلی خود را MainActivity بگذارید.
کلاس جدیدی را از پکیج اصلی به پروژه اضافه کنید و نام آن را webView بگذارید.( برای این کار روی پکیج اصلی راست کلیک کرده و از منوی new گزینه java را انتخاب کنید و در پنجره ظاهر شده نام آن را webView بگذارید).
به دنبال ایجاد کلاس جدید webView، از مسیر res ⇒ layout لایوت جدیدی را ایجاد کرده و نام آن را activity_webview بگذارید. البته در کنار لایوت ایجاد شده لایوت دیگری به نام activity_main وجود دارد که لایوت اکتیویتی اصلی یا همان MainActivity است.
در مسیر res ⇒ layout لایوت activity_main را باز کرده و کدهای Xml آن را بدین صورت می نویسیم:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.site.psrd.webview.MainActivity"> <EditText android:layout_width="fill_parent" android:layout_height="50dp" android:id="@+id/username" android:textAlignment="center" android:hint="username" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="26dp" /> <EditText android:layout_width="fill_parent" android:layout_height="50dp" android:id="@+id/password" android:hint="password" android:textAlignment="center" android:layout_below="@+id/username" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="40dp" /> <Button android:layout_width="fill_parent" android:layout_height="50dp" android:id="@+id/send" android:text="send" android:textAlignment="center" android:layout_below="@+id/password" android:layout_centerHorizontal="true" android:layout_marginTop="68dp" /> </RelativeLayout>
بعد از افزودن کدهای فوق به لایوت اکتیویتی اصلی برنامه یعنی activity_main ، به سراغ کدهای کلاس جاوای همین اکتیویتی می رویم. کدهای کلاس جاوای MainActivity به شرح زیر خواهد بود:
import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.webkit.WebView; import android.widget.Button; import android.widget.EditText; public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText user = (EditText)findViewById(R.id.username); final EditText pass = (EditText)findViewById(R.id.password); Button sendbtn = (Button)findViewById(R.id.send); sendbtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String uservalue = user.getText().toString(); String passwordvalue = pass.getText().toString(); Intent Myintent = new Intent(getApplicationContext(), Webview.class); Myintent.putExtra("keypost1", uservalue); Myintent.putExtra("keypost2", passwordvalue); startActivity(Myintent); } }); } }
بعد از افزودن کدهای زیر به کلاس MainActivity به سراغ لایوت متناظر کلاس webView یعنی activity_webview رفته و کدهای xml آن را به این ترتیب می نویسیم:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:tools="http://schemas.android.com/tools" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.site.psrd.webview.MainActivity"> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/webVew"> </WebView> </RelativeLayout>
بعد از نوشتن لایوت فوق که شامل وب ویو با مشخصات فوق می باشد سراغ کلاس جاوای WebView می رویم و کدهای آن را به این صورت می نویسیم:
import android.app.ProgressDialog; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Gravity; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.webkit.JsResult; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast; import org.apache.http.util.EncodingUtils; public class Webview extends AppCompatActivity { private WebView webView; String url = "http://psrd.ir/fixurl/postwebview.php"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_webview); webView = (WebView) findViewById(R.id.webVew); startWebView(url); } private void startWebView(String url) { webView.setWebViewClient(new WebViewClient() { ProgressDialog progressDialog; public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } //Show loader on url load public void onLoadResource(WebView view, String url) { if (progressDialog == null) { // in standard case YourActivity.this progressDialog = new ProgressDialog(Webview.this); progressDialog.setMessage("کمی منتظر بمانید"); progressDialog.setIndeterminate(true); progressDialog.setCancelable(false); progressDialog.getWindow().setGravity(Gravity.CENTER); progressDialog.show(); Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() { progressDialog.dismiss(); } }, 5000); } } }); webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { return super.onJsAlert(view, url, message, result); } }); // Javascript inabled on webview webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().getAllowContentAccess(); webView.getSettings().setLoadWithOverviewMode(true); webView.getSettings().setUseWideViewPort(true); webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); webView.setScrollbarFadingEnabled(false); webView.getSettings().setBuiltInZoomControls(false); CookieSyncManager.createInstance(this); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); WebSettings ws = webView.getSettings(); webView.getSettings().setSaveFormData(false); webView.clearCache(true); webView.clearHistory(); webView.getSettings().setSupportMultipleWindows(true); webView.loadUrl(url); Bundle extras = getIntent().getExtras(); if (extras != null) { String myuser = extras.getString("keypost1"); String mypass = extras.getString("keypost2"); Toast.makeText(Webview.this, mypass + "-------" + myuser, Toast.LENGTH_LONG).show(); String postData = "user=" + myuser + "&password=" + mypass; webView.postUrl(url, EncodingUtils.getBytes(postData, "utf-8")); } } @Override public void onBackPressed() { if(webView.canGoBack()) { webView.goBack(); } else { // Let the system handle the back button super.onBackPressed(); } finish(); } }
و در نهایت مجوز یا همان premission دسترسی به اینترنت را که به شکل زیر می باشد :
<uses-permission android:name="android.permission.INTERNET">
به AndroidManifest.xml اضافه می کنیم:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.site.psrd.webview"> <uses-permission android:name="android.permission.INTERNET"> </uses-permission> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Webview" android:label="@string/title_activity_webview" android:theme="@style/AppTheme.NoActionBar"> </activity> </application> </manifest>
بعد اتمام کدنویسی در محیط برنامه نویسی اندروید به منظور تعیین url یا همان آدرس محل پست، کدهای php را را به شکل زیر در محل تعیین شده در سرور خودتان در قالب فایل php ایجاد کنید. البته آدرس بکار رفته در پروژه به شکل ثابت در سرور سایت ما وجود دارد و می توانید پروژه را بدون داشتن سرور نیز اجرا کنید.کدهای php نیز بدین صورت خواهد بود :
<?php if(isset($_POST['user']) && isset($_POST['password'])){ $user= $_POST['user']; $user = htmlspecialchars($user); $user = strip_tags($user); $password = $_POST['password']; $password = htmlspecialchars($password); $password = strip_tags($password); echo "user : ".$user." --- password : ".$password.""; } ?>
حال می توانید پروژه را اجرا کرده و آن را در پروژه خودتان به هرشکلی که دوست دارید بکارببرید.
برای دانلود سورس برنامه اینجا کلیک کنید.
برای دانلود فایل apk اینجا کلیک کنید
کپی برداری از محتوای سایت psrd، ممنوع بوده و پیگرد قانونی دارد. (تنها استفاده شخصی کاربران ، مجاز است) (کپی برداری توسط سایر وب سایت ها غیرقانونی بوده و در صورت رویت به ستادسازماندهی اطلاع داده خواهد شد.
0 دیدگاه