2017-04-03 113 views
0

我有一個android webapp,它使用與我一直使用的其他webview客戶端不同的格式。但是,它不會執行文件上傳按鈕所需的JavaScript。默認的瀏覽器可以處理上傳,但以前的webview客戶端不能,這就是爲什麼我選擇使用這個項目。無法在android webview中實現javascript

我會給你整個MainAvivity.java文件。 output

import android.Manifest; 
import android.annotation.SuppressLint; 
import android.annotation.TargetApi; 
import android.app.Activity; 
import android.app.ActivityManager; 
import android.app.Notification; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.ActivityNotFoundException; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.content.res.Configuration; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Environment; 
import android.os.Handler; 
import android.provider.MediaStore; 
import android.provider.Settings; 
import android.support.annotation.NonNull; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.app.NotificationCompat; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.WindowManager; 
import android.webkit.CookieManager; 
import android.webkit.ValueCallback; 
import android.webkit.WebChromeClient; 
import android.webkit.WebResourceError; 
import android.webkit.WebResourceRequest; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.io.File; 
import java.io.IOException; 
import java.math.BigInteger; 
import java.security.SecureRandom; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class MainActivity extends AppCompatActivity { 

    //Permission variables 
    static boolean ASWP_JSCRIPT  = true;  //enable JavaScript for webview 
    static boolean ASWP_FUPLOAD  = true;  //upload file from webview 
    static boolean ASWP_CAMUPLOAD = true;  //enable upload from camera for photos 
    static boolean ASWP_MULFILE  = false; //upload multiple files in webview 
    static boolean ASWP_LOCATION = true;  //track GPS locations 
    static boolean ASWP_RATINGS  = true;  //show ratings dialog; auto configured, edit method get_rating() for customizations 
    static boolean ASWP_PBAR  = true;  //show progress bar in app 
    static boolean ASWP_ZOOM  = false; //zoom in webview 
    static boolean ASWP_SFORM  = false; //save form cache and auto-fill information 
    static boolean ASWP_OFFLINE  = true;  //whether the loading webpages are offline or online 
    static boolean ASWP_EXTURL  = true;  //open external url with default browser instead of app webview 

    //Configuration variables 
    private static String ASWV_URL  = "http://example.com"; //complete URL of your website or webpage 
    private static String ASWV_F_TYPE = "*/*"; //to upload any file type using "*/*"; check file type references for more 
    public static String ASWV_HOST  = aswm_host(ASWV_URL); 

    //Careful with these variable names if altering 
    WebView asw_view; 
    ProgressBar asw_progress; 
    TextView asw_loading_text; 
    NotificationManager asw_notification; 
    Notification asw_notification_new; 

    private String asw_cam_message; 
    private ValueCallback<Uri> asw_file_message; 
    private ValueCallback<Uri[]> asw_file_path; 
    private final static int asw_file_req = 1; 

    private final static int loc_perm = 1; 
    private final static int file_perm = 2; 

    private SecureRandom random = new SecureRandom(); 



    private static final String TAG = MainActivity.class.getSimpleName(); 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 
     if (Build.VERSION.SDK_INT >= 21) { 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
      getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimary)); 
      Uri[] results = null; 
      if (resultCode == Activity.RESULT_OK) { 
       if (requestCode == asw_file_req) { 
        if (null == asw_file_path) { 
         return; 
        } 
        if (intent == null) { 
         if (asw_cam_message != null) { 
          results = new Uri[]{Uri.parse(asw_cam_message)}; 
         } 
        } else { 
         String dataString = intent.getDataString(); 
         if (dataString != null) { 
          results = new Uri[]{ Uri.parse(dataString) }; 
         } 
        } 
       } 
      } 
      asw_file_path.onReceiveValue(results); 
      asw_file_path = null; 
     } else { 
      if (requestCode == asw_file_req) { 
       if (null == asw_file_message) return; 
       Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData(); 
       asw_file_message.onReceiveValue(result); 
       asw_file_message = null; 
      } 
     } 
    } 



    @SuppressLint({"SetJavaScriptEnabled", "WrongViewCast"}) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     if (ASWP_PBAR) { 
      asw_progress = (ProgressBar) findViewById(R.id.msw_progress); 
     } else { 
      findViewById(R.id.msw_progress).setVisibility(View.GONE); 
     } 
     asw_loading_text = (TextView) findViewById(R.id.msw_loading_text); 
     Handler handler = new Handler(); 

     //Launching app rating request 
     if (ASWP_RATINGS) { 
      handler.postDelayed(new Runnable() { public void run() { get_rating(); }}, 1000 * 60); //running request after few moments 
     } 

     //Getting basic device information 
     get_info(); 

     //Getting GPS location of device if given permission 
     get_location(); 

     asw_view = (WebView) findViewById(R.id.msw_view); 

     //Webview settings; defaults are customized for best performance 
     WebSettings webSettings = asw_view.getSettings(); 

     if(!ASWP_OFFLINE){ 
      webSettings.setJavaScriptEnabled(ASWP_JSCRIPT); 
     } 
     webSettings.setSaveFormData(ASWP_SFORM); 
     webSettings.setSupportZoom(ASWP_ZOOM); 
     webSettings.setGeolocationEnabled(ASWP_LOCATION); 
     webSettings.setAllowFileAccess(true); 
     webSettings.setAllowFileAccessFromFileURLs(true); 
     webSettings.setAllowUniversalAccessFromFileURLs(true); 
     webSettings.setUseWideViewPort(true); 
     webSettings.setDomStorageEnabled(true); 
     webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS); 

     if (Build.VERSION.SDK_INT >= 21) { 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
      getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark)); 
      asw_view.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
      webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); 
     } else if (Build.VERSION.SDK_INT >= 19) { 
      asw_view.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
     } else if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 19) { 
      asw_view.requestFocus(); 
      asw_view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
     } 
     asw_view.setVerticalScrollBarEnabled(false); 
     asw_view.setWebViewClient(new Callback()); 

     //Rendering the default URL 
     aswm_view(ASWV_URL, false); 

     asw_view.setWebChromeClient(new WebChromeClient() { 
      //Handling input[type="file"] requests for android API 16+ 
      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){ 
       if(ASWP_FUPLOAD) { 
        asw_file_message = uploadMsg; 
        Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
        i.addCategory(Intent.CATEGORY_OPENABLE); 
        i.setType(ASWV_F_TYPE); 
        startActivityForResult(Intent.createChooser(i, "File Chooser"), asw_file_req); 
       } 
      } 
      //Handling input[type="file"] requests for android API 21+ 
      public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,WebChromeClient.FileChooserParams fileChooserParams){ 
       get_file(); 
       if(ASWP_FUPLOAD) { 
        if (asw_file_path != null) { 
         asw_file_path.onReceiveValue(null); 
        } 
        asw_file_path = filePathCallback; 
        Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT); 
        contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE); 
        contentSelectionIntent.setType(ASWV_F_TYPE); 
        Intent[] intentArray; 
        if (ASWP_CAMUPLOAD) { 
         Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
         if (takePictureIntent.resolveActivity(MainActivity.this.getPackageManager()) != null) { 
          File photoFile = null; 
          try { 
           photoFile = create_image(); 
           takePictureIntent.putExtra("PhotoPath", asw_cam_message); 
          } catch (IOException ex) { 
           Log.e(TAG, "Image file creation failed", ex); 
          } 
          if (photoFile != null) { 
           asw_cam_message = "file:" + photoFile.getAbsolutePath(); 
           takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
          } else { 
           takePictureIntent = null; 
          } 
         } 
         if (takePictureIntent != null) { 
          intentArray = new Intent[]{takePictureIntent}; 
         } else { 
          intentArray = new Intent[0]; 
         } 
        } else { 
         intentArray = new Intent[0]; 
        } 
        Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER); 
        chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent); 
        chooserIntent.putExtra(Intent.EXTRA_TITLE, "File Chooser"); 
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); 
        startActivityForResult(chooserIntent, asw_file_req); 
       } 
       return true; 
      } 

      //Getting webview rendering progress 
      @Override 
      public void onProgressChanged(WebView view, int p) { 
       if (ASWP_PBAR) { 
        asw_progress.setProgress(p); 
        if (p == 100) { 
         asw_progress.setProgress(0); 
        } 
       } 
      } 
     }); 
     if (getIntent().getData() != null) { 
      String path  = getIntent().getDataString(); 
      /* 
      If you want to check or use specific directories or schemes or hosts 

      Uri data  = getIntent().getData(); 
      String scheme = data.getScheme(); 
      String host  = data.getHost(); 
      List<String> pr = data.getPathSegments(); 
      String param1 = pr.get(0); 
      */ 
      aswm_view(path, false); 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     //Coloring the "recent apps" tab header; doing it onResume, as an insurance 
     if (Build.VERSION.SDK_INT >= 23) { 
      Bitmap bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); 
      ActivityManager.TaskDescription taskDesc = null; 
      taskDesc = new ActivityManager.TaskDescription(getString(R.string.app_name), bm, getColor(R.color.colorPrimary)); 
      MainActivity.this.setTaskDescription(taskDesc); 
     } 
     get_location(); 
    } 

    //Setting activity layout visibility 
    private class Callback extends WebViewClient { 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      get_location(); 
     } 

     public void onPageFinished(WebView view, String url) { 
      findViewById(R.id.msw_welcome).setVisibility(View.GONE); 
      findViewById(R.id.msw_view).setVisibility(View.VISIBLE); 
     } 
     //For android below API 23 
     @SuppressWarnings("deprecation") 
     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      Toast.makeText(getApplicationContext(), "Something Went Wrong!", Toast.LENGTH_SHORT).show(); 
      aswm_view("file:///android_res/raw/error.html", false); 
     } 

     @Override 
     public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { 
      Toast.makeText(getApplicationContext(), "Something Went Wrong!", Toast.LENGTH_SHORT).show(); 
      aswm_view("file:///android_res/raw/error.html", false); 
     } 

     //Overriding webview URLs 
     @SuppressWarnings("deprecation") 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      return url_actions(view, url); 
     } 

     //Overriding webview URLs for API 23+ [suggested by github.com/JakePou] 
     @TargetApi(Build.VERSION_CODES.N) 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
      return url_actions(view, request.getUrl().toString()); 
     } 
    } 



    //Random ID creation function to help get fresh cache every-time webview reloaded 
    public String random_id() { 
     return new BigInteger(130, random).toString(32); 
    } 

    //Opening URLs inside webview with request 
    void aswm_view(String url, Boolean tab) { 
     if (tab) { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      startActivity(intent); 
     } else { 
      asw_view.loadUrl(url+"?rid="+random_id()); 
     } 
    } 

    //Actions based on shouldOverrideUrlLoading 
    public boolean url_actions(WebView view, String url){ 
     boolean a = true; 
     //Show toast error if not connected to the network 
     if (!ASWP_OFFLINE && !DetectConnection.isInternetAvailable(MainActivity.this)) { 
      Toast.makeText(getApplicationContext(), "Please check your Network Connection!", Toast.LENGTH_SHORT).show(); 

      //Use this in a hyperlink to redirect back to default URL :: href="refresh:android" 
     } else if (url.startsWith("refresh:")) { 
      aswm_view(ASWV_URL, false); 

      //Use this in a hyperlink to launch default phone dialer for specific number :: href="tel:" 
     } else if (url.startsWith("tel:")) { 
      Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url)); 
      startActivity(intent); 

      //Use this to open your apps page on google play store app :: href="rate:android" 
     } else if (url.startsWith("rate:")) { 
      final String app_package = getPackageName(); //requesting app package name from Context or Activity object 
      try { 
       startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + app_package))); 
      } catch (ActivityNotFoundException anfe) { 
       startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + app_package))); 
      } 

      //Sharing content from your webview to external apps :: href="share:URL" and remember to place the URL you want to share after share:___ 
     } else if (url.startsWith("share:")) { 
      Intent intent = new Intent(Intent.ACTION_SEND); 
      intent.setType("text/plain"); 
      intent.putExtra(Intent.EXTRA_SUBJECT, view.getTitle()); 
      intent.putExtra(Intent.EXTRA_TEXT, view.getTitle()+"\nVisit: "+(Uri.parse(url).toString()).replace("share:","")); 
      startActivity(Intent.createChooser(intent, "Share with your Friends")); 

      //Use this in a hyperlink to exit your app :: href="exit:android" 
     } else if (url.startsWith("exit:")) { 
      Intent intent = new Intent(Intent.ACTION_MAIN); 
      intent.addCategory(Intent.CATEGORY_HOME); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(intent); 

      //Opening external URLs in android default web browser 
     } else if (ASWP_EXTURL && aswm_host(ASWV_URL)!=ASWV_HOST) { 
      aswm_view(url,true); 

     } else { 
      a = false; 
     } 
     return a; 
    } 

    //Getting host name 
    public static String aswm_host(String url){ 
     if (url == null || url.length() == 0) { 
      return ""; 
     } 
     int dslash = url.indexOf("//"); 
     if (dslash == -1) { 
      dslash = 0; 
     } else { 
      dslash += 2; 
     } 
     int end = url.indexOf('/', dslash); 
     end = end >= 0 ? end : url.length(); 
     int port = url.indexOf(':', dslash); 
     end = (port > 0 && port < end) ? port : end; 
     Log.w("URL Host: ",url.substring(dslash, end)); 
     return url.substring(dslash, end); 
    } 

    //Getting device basic information 
    public void get_info(){ 
     CookieManager cookieManager = CookieManager.getInstance(); 
     cookieManager.setAcceptCookie(true); 
     cookieManager.setCookie(ASWV_URL, "DEVICE=android"); 
     cookieManager.setCookie(ASWV_URL, "DEV_API=" + Build.VERSION.SDK_INT); 
    } 

    //Checking permission for storage and camera for writing and uploading images 
    public void get_file(){ 
     String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; 

     //Checking for storage permission to write images for upload 
     if (ASWP_FUPLOAD && ASWP_CAMUPLOAD && !check_permission(2) && !check_permission(3)) { 
      ActivityCompat.requestPermissions(MainActivity.this, perms, file_perm); 

     //Checking for WRITE_EXTERNAL_STORAGE permission 
     } else if (ASWP_FUPLOAD && !check_permission(2)) { 
      ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, file_perm); 

     //Checking for CAMERA permissions 
     } else if (ASWP_CAMUPLOAD && !check_permission(3)) { 
      ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, file_perm); 
     } 
    } 

    //Using cookies to update user locations 
    public void get_location(){ 
     CookieManager cookieManager = CookieManager.getInstance(); 
     cookieManager.setAcceptCookie(true); 
     if(ASWP_LOCATION) { 
      //Checking for location permissions 
      if (Build.VERSION.SDK_INT >= 23 && !check_permission(1)) { 
       ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, loc_perm); 
       show_notification(2, 2); 

      } else { 
       GPSTrack gps; 
       gps = new GPSTrack(MainActivity.this); 
       double latitude = gps.getLatitude(); 
       double longitude = gps.getLongitude(); 
       if (gps.canGetLocation()) { 
        if (latitude != 0 || longitude != 0) { 
         cookieManager.setCookie(ASWV_URL, "lat=" + latitude); 
         cookieManager.setCookie(ASWV_URL, "long=" + longitude); 
         //Log.w("New Updated Location:", latitude + "," + longitude); //enable to test dummy latitude and longitude 
        } else { 
         Log.w("New Updated Location:", "NULL"); 
        } 
       } else { 
        show_notification(1, 1); 
        Log.w("New Updated Location:", "FAIL"); 
       } 
      } 
     } 
    } 

    //Checking if particular permission is given or not 
    public boolean check_permission(int permission){ 
     switch(permission){ 
      case 1: 
       return ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; 

      case 2: 
       return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; 

      case 3: 
       return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; 

     } 
     return false; 
    } 

    //Creating image file for upload 
    private File create_image() throws IOException { 
     @SuppressLint("SimpleDateFormat") 
     String file_name = new SimpleDateFormat("yyyy_mm_ss").format(new Date()); 
     String new_name  = "file_"+file_name+"_"; 
     File sd_directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
     return File.createTempFile(new_name, ".jpg", sd_directory); 
    } 

    //Launching app rating dialoge [developed by github.com/hotchemi] 
    public void get_rating() { 
     if (DetectConnection.isInternetAvailable(MainActivity.this)) { 
      AppRate.with(this) 
       .setStoreType(StoreType.GOOGLEPLAY)  //default is Google Play, other option is Amazon App Store 
       .setInstallDays(3)      //after how many days would you like to show the dialoge 
       .setLaunchTimes(10)      //overall request launch times being ignored 
       .setRemindInterval(2)     //reminding users to rate after days interval 
       .setTitle(R.string.rate_dialog_title) 
       .setMessage(R.string.rate_dialog_message) 
       .setTextLater(R.string.rate_dialog_cancel) 
       .setTextNever(R.string.rate_dialog_no) 
       .setTextRateNow(R.string.rate_dialog_ok) 
       .monitor(); 
      AppRate.showRateDialogIfMeetsConditions(this); 
     } 
     //for more customizations, edit AppRate and DialogOptions 
    } 

    //Creating custom notifications with IDs 
    public void show_notification(int type, int id) { 
     long when = System.currentTimeMillis(); 
     asw_notification = (NotificationManager) MainActivity.this.getSystemService(Context.NOTIFICATION_SERVICE); 
     Intent i = new Intent(); 
     if (type == 1) { 
      i.setClass(MainActivity.this, MainActivity.class); 
     } else if (type == 2) { 
      i.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
     } else { 
      i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
      i.addCategory(Intent.CATEGORY_DEFAULT); 
      i.setData(Uri.parse("package:" + MainActivity.this.getPackageName())); 
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
      i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
     } 
     i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

     PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 

     Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 

     NotificationCompat.Builder builder = (NotificationCompat.Builder) new NotificationCompat.Builder(MainActivity.this); 
     switch(type){ 
      case 1: 
       builder.setTicker(getString(R.string.app_name)); 
       builder.setContentTitle(getString(R.string.loc_fail)); 
       builder.setContentText(getString(R.string.loc_fail_text)); 
       builder.setStyle(new NotificationCompat.BigTextStyle().bigText(getString(R.string.loc_fail_more))); 
       builder.setVibrate(new long[]{350,350,350,350,350}); 
       builder.setSmallIcon(R.mipmap.ic_launcher); 
      break; 

      case 2: 
       builder.setTicker(getString(R.string.app_name)); 
       builder.setContentTitle(getString(R.string.app_name)); 
       builder.setContentText(getString(R.string.loc_perm_text)); 
       builder.setStyle(new NotificationCompat.BigTextStyle().bigText(getString(R.string.loc_perm_more))); 
       builder.setVibrate(new long[]{350, 700, 350, 700, 350}); 
       builder.setSound(alarmSound); 
       builder.setSmallIcon(R.mipmap.ic_launcher); 
      break; 
     } 
     builder.setOngoing(false); 
     builder.setAutoCancel(true); 
     builder.setContentIntent(pendingIntent); 
     builder.setWhen(when); 
     builder.setContentIntent(pendingIntent); 
     asw_notification_new = builder.getNotification(); 
     asw_notification.notify(id, asw_notification_new); 
    } 

    //Checking if users allowed the requested permissions or not 
    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults){ 
     switch (requestCode){ 
      case 1: { 
       if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
        get_location(); 
       }else{ 
        show_notification(2, 2); 
        Toast.makeText(MainActivity.this, R.string.loc_req, Toast.LENGTH_LONG).show(); 
       } 
      } 
     } 
    } 

    //Action on back key tap/click 
    @Override 
    public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) { 
     if (event.getAction() == KeyEvent.ACTION_DOWN) { 
      switch (keyCode) { 
       case KeyEvent.KEYCODE_BACK: 
        if (asw_view.canGoBack()) { 
         asw_view.goBack(); 
        } else { 
         finish(); 
        } 
        return true; 
      } 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState){ 
     super.onSaveInstanceState(outState); 
     asw_view.saveState(outState); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState){ 
     super.onRestoreInstanceState(savedInstanceState); 
     asw_view.restoreState(savedInstanceState); 
    } 
} 
+0

爲什麼你需要這個條件?你總是可以去javascriptenabled .. webSettings.setJavaScriptEnabled(true); – Stallion

+0

試試吧。這將有助於你[點擊這裏](http://stackoverflow.com/a/10481108/5725745) –

回答

1

這是所有Android版本的完整的解決方案,我有一個困難時期這一點。

public class MyWb extends Activity { 
/** Called when the activity is first created. */ 

WebView web; 
ProgressBar progressBar; 

private ValueCallback<Uri> mUploadMessage; 
private final static int FILECHOOSER_RESULTCODE=1; 

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
            Intent intent) { 
    if(requestCode==FILECHOOSER_RESULTCODE) 
    { 
    if (null == mUploadMessage) return; 
      Uri result = intent == null || resultCode != RESULT_OK ? null 
        : intent.getData(); 
      mUploadMessage.onReceiveValue(result); 
      mUploadMessage = null; 
    } 
    } 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    web = (WebView) findViewById(R.id.webview01); 
    progressBar = (ProgressBar) findViewById(R.id.progressBar1); 

    web = new WebView(this); 
    web.getSettings().setJavaScriptEnabled(true); 
    web.loadUrl("http://www.script-tutorials.com/demos/199/index.html"); 
    web.setWebViewClient(new myWebClient()); 
    web.setWebChromeClient(new WebChromeClient() 
    { 
      //The undocumented magic method override 
      //Eclipse will swear at you if you try to put @Override here 
     // For Android 3.0+ 
     public void openFileChooser(ValueCallback<Uri> uploadMsg) { 

      mUploadMessage = uploadMsg; 
      Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
      i.addCategory(Intent.CATEGORY_OPENABLE); 
      i.setType("image/*"); 
      MyWb.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FILECHOOSER_RESULTCODE); 

      } 

     // For Android 3.0+ 
      public void openFileChooser(ValueCallback uploadMsg, String acceptType) { 
      mUploadMessage = uploadMsg; 
      Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
      i.addCategory(Intent.CATEGORY_OPENABLE); 
      i.setType("*/*"); 
      MyWb.this.startActivityForResult(
      Intent.createChooser(i, "File Browser"), 
      FILECHOOSER_RESULTCODE); 
      } 

     //For Android 4.1 
      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){ 
       mUploadMessage = uploadMsg; 
       Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
       i.addCategory(Intent.CATEGORY_OPENABLE); 
       i.setType("image/*"); 
       MyWb.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MyWb.FILECHOOSER_RESULTCODE); 

      } 

    }); 


    setContentView(web); 


} 

public class myWebClient extends WebViewClient 
{ 
    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     // TODO Auto-generated method stub 
     super.onPageStarted(view, url, favicon); 
    } 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     // TODO Auto-generated method stub 

     view.loadUrl(url); 
     return true; 

    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     // TODO Auto-generated method stub 
     super.onPageFinished(view, url); 

     progressBar.setVisibility(View.GONE); 
    } 
} 

//flipscreen not loading again 
@Override 
public void onConfigurationChanged(Configuration newConfig){   
    super.onConfigurationChanged(newConfig); 
} 

// To handle "Back" key press event for WebView to go back to previous screen. 
/*@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) { 
     web.goBack(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
}*/ 
} 

另外我想補充一點,「上傳頁面」就像一個在這個例子中,不會工作在< 4個版本,因爲它有一個圖像預覽功能,如果你想它的工作使用簡單php上傳沒有預覽。

更新:

請找到棒棒糖設備here,並感謝該解決方案gauntface

更新2:

發現所有的Android設備,包括marshmallow在這裏看到它的GitHub項目更完整的解決方案。

相關問題