HTML input type 'file' is not working on webview in android. Is there any way to upload file using webview android?

前端 未结 4 753
伪装坚强ぢ
伪装坚强ぢ 2020-12-14 03:25

this is my browsing code of html.

This is my android code which load html file for browse file and upload on server.

        runOnUiThread(new R         


        
相关标签:
4条回答
  • 2020-12-14 03:45

    This is work for me. Also work for Nugget and Marshmallow

    import android.Manifest;
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.content.res.Configuration;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    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.util.Log;
    import android.view.KeyEvent;
    import android.view.View;
    import android.webkit.ValueCallback;
    import android.webkit.WebChromeClient;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.Toast;
    import java.io.File;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class MainActivity extends AppCompatActivity{
        WebView webView;
        private static final String TAG = MainActivity.class.getSimpleName();
        private String mCM;
        private ValueCallback<Uri> mUM;
        private ValueCallback<Uri[]> mUMA;
        private final static int FCR=1;
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent intent){
    
    
            super.onActivityResult(requestCode, resultCode, intent);
            if(Build.VERSION.SDK_INT >= 21){
                Uri[] results = null;
                //Check if response is positive
                if(resultCode== Activity.RESULT_OK){
                    if(requestCode == FCR){
                        if(null == mUMA){
                            return;
                        }
                        if(intent == null){
                            //Capture Photo if no image available
                            if(mCM != null){
                                results = new Uri[]{Uri.parse(mCM)};
                            }
                        }else{
                            String dataString = intent.getDataString();
                            if(dataString != null){
                                results = new Uri[]{Uri.parse(dataString)};
                            }
                        }
                    }
                }
                mUMA.onReceiveValue(results);
                mUMA = null;
            }else{
                if(requestCode == FCR){
                    if(null == mUM) return;
                    Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
                    mUM.onReceiveValue(result);
                    mUM = null;
                }
            }
        }
    
        @SuppressLint({"SetJavaScriptEnabled", "WrongViewCast"})
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            if(Build.VERSION.SDK_INT >=23 && (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)) {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 1);
            }
    
            webView = (WebView) findViewById(R.id.ifView);
            assert webView != null;
            WebSettings webSettings = webView.getSettings();
            webSettings.setJavaScriptEnabled(true);
            webSettings.setAllowFileAccess(true);
    
            if(Build.VERSION.SDK_INT >= 21){
                webSettings.setMixedContentMode(0);
                webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
            }else if(Build.VERSION.SDK_INT >= 19){
                webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
            }else if(Build.VERSION.SDK_INT < 19){
                webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
            }
            webView.setWebViewClient(new Callback());
            webView.loadUrl("https://infeeds.com/");
            webView.setWebChromeClient(new WebChromeClient(){
                //For Android 3.0+
                public void openFileChooser(ValueCallback<Uri> uploadMsg){
                    mUM = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("*/*");
                    MainActivity.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FCR);
                }
                // For Android 3.0+, above method not supported in some android 3+ versions, in such case we use this
                public void openFileChooser(ValueCallback uploadMsg, String acceptType){
                    mUM = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("*/*");
                    MainActivity.this.startActivityForResult(
                            Intent.createChooser(i, "File Browser"),
                            FCR);
                }
                //For Android 4.1+
                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
                    mUM = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("*/*");
                    MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), MainActivity.FCR);
                }
                //For Android 5.0+
                public boolean onShowFileChooser(
                        WebView webView, ValueCallback<Uri[]> filePathCallback,
                        WebChromeClient.FileChooserParams fileChooserParams){
                    if(mUMA != null){
                        mUMA.onReceiveValue(null);
                    }
                    mUMA = filePathCallback;
                    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    if(takePictureIntent.resolveActivity(MainActivity.this.getPackageManager()) != null){
                        File photoFile = null;
                        try{
                            photoFile = createImageFile();
                            takePictureIntent.putExtra("PhotoPath", mCM);
                        }catch(IOException ex){
                            Log.e(TAG, "Image file creation failed", ex);
                        }
                        if(photoFile != null){
                            mCM = "file:" + photoFile.getAbsolutePath();
                            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
                        }else{
                            takePictureIntent = null;
                        }
                    }
                    Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
                    contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
                    contentSelectionIntent.setType("*/*");
                    Intent[] intentArray;
                    if(takePictureIntent != null){
                        intentArray = new Intent[]{takePictureIntent};
                    }else{
                        intentArray = new Intent[0];
                    }
    
                    Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
                    chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
                    chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");
                    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
                    startActivityForResult(chooserIntent, FCR);
                    return true;
                }
            });
        }
        public class Callback extends WebViewClient{
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){
                Toast.makeText(getApplicationContext(), "Failed loading app!", Toast.LENGTH_SHORT).show();
            }
        }
        // Create an image file
        private File createImageFile() throws IOException{
            @SuppressLint("SimpleDateFormat") String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            String imageFileName = "img_"+timeStamp+"_";
            File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
            return File.createTempFile(imageFileName,".jpg",storageDir);
        }
        @Override
        public boolean onKeyDown(int keyCode, @NonNull KeyEvent event){
            if(event.getAction() == KeyEvent.ACTION_DOWN){
                switch(keyCode){
                    case KeyEvent.KEYCODE_BACK:
                        if(webView.canGoBack()){
                            webView.goBack();
                        }else{
                            finish();
                        }
                        return true;
                }
            }
            return super.onKeyDown(keyCode, event);
        }
    
        @Override
        public void onConfigurationChanged(Configuration newConfig){
            super.onConfigurationChanged(newConfig);
        }
    }
    
    0 讨论(0)
  • 2020-12-14 03:48

    I'm new to Andriod and struggled with this also. According to Google Reference Guide WebView.

    By default, a WebView provides no browser-like widgets, does not enable JavaScript and web page errors are ignored. If your goal is only to display some HTML as a part of your UI, this is probably fine; the user won't need to interact with the web page beyond reading it, and the web page won't need to interact with the user. If you actually want a full-blown web browser, then you probably want to invoke the Browser application with a URL Intent rather than show it with a WebView.

    Example code I executed in MainActvity.java.

     Uri uri = Uri.parse("https://www.example.com");
     Intent intent = new Intent(Intent.ACTION_VIEW, uri);
     startActivity(intent);
    

    Excuted

    package example.com.myapp;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.content.Intent;
    import android.net.Uri;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Uri uri = Uri.parse("http://www.example.com/");
            Intent intent = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(intent);
            getSupportActionBar().hide();
        }}
    
    0 讨论(0)
  • 2020-12-14 04:02

    This code is working for me.....

    Here, no need to ask storage permissions to the user....

    package app.qarya.in.upsc4u.questions.answers;
    import android.annotation.SuppressLint;
    import android.app.NotificationChannel;
    import android.app.NotificationManager;
    import android.app.ProgressDialog;
    import android.content.ActivityNotFoundException;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.content.pm.ActivityInfo;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import android.os.Handler;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.annotation.RequiresApi;
    import android.support.v4.widget.SwipeRefreshLayout;
    import android.support.v7.app.AlertDialog;
    import android.support.v7.app.AppCompatActivity;
    import android.view.KeyEvent;
    import android.view.View;
    import android.webkit.ValueCallback;
    import android.webkit.WebChromeClient;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.FrameLayout;
    import android.widget.ProgressBar;
    import android.widget.Toast;
    
    import com.google.android.gms.ads.AdListener;
    import com.google.android.gms.ads.AdRequest;
    import com.google.android.gms.ads.AdView;
    import com.google.android.gms.ads.InterstitialAd;
    import com.google.android.gms.ads.MobileAds;
    import com.google.android.gms.tasks.OnCompleteListener;
    import com.google.android.gms.tasks.Task;
    
    
    public class WebPageMain extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {
    
        String webAddress = "https://qarya.in/";
        public static final int REQUEST_SELECT_FILE = 100;
        WebView webView;
        ProgressBar progressBar;
        FrameLayout frameLayout;
        SwipeRefreshLayout swipeRefreshLayout;
        ProgressDialog pd;
        static int count=0;
        AdView adView;
        AdRequest adRequest;
        InterstitialAd interstitialAd;
        private ValueCallback<Uri[]> uploadMessage;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.web_page);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    
             MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713");
    
    
    
            pd = new ProgressDialog(this);
            pd.setMessage("Loading please wait...");
            pd.show();
    
            swipeRefreshLayout = findViewById(R.id.srl);
            swipeRefreshLayout.setOnRefreshListener(this);
    
            frameLayout = findViewById(R.id.framLayout);
            progressBar = findViewById(R.id.progressBar);
            assert webView != null;
            progressBar.setMax(100);
            webView = findViewById(R.id.webView);
            webView.setWebViewClient(new Callback());
            webView.getSettings().setJavaScriptEnabled(true);
            webView.setVerticalFadingEdgeEnabled(false);
            webView.loadUrl(webAddress);
            progressBar.setProgress(0);
            adView = findViewById(R.id.adView);
            adRequest = new AdRequest.Builder().build();
            //adView.loadAd(adRequest);
    
            interstitialAd = new InterstitialAd(this);
            interstitialAd.setAdUnitId(getResources().getString(R.string.inter));
            //interstitialAd.loadAd(adRequest);
            //showInterAd();
    
    
            webView.setWebChromeClient(new WebChromeClient() {
    
                public void onProgressChanged(WebView webView,int progress)
                {
                    frameLayout.setVisibility(View.VISIBLE);
                    progressBar.setProgress(progress);
                    //setTitle("Loading...");
    
                    if(progress==100)
                    {
                        frameLayout.setVisibility(View.GONE);
                        pd.dismiss();
                        //setTitle(webView.getTitle());
                    }
                    else if(progress==70)
                    {
                        pd.dismiss();
                        count+=1;
                        if(count%5==0) {
                            interstitialAd.loadAd(adRequest);
                            showInterAd();
                        }
                        adView.loadAd(adRequest);
                    }
    
                    //Log.d("progress",progress+"");
                    super.onProgressChanged(webView,progress);
                }
    
                @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
                public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
                    // make sure there is no existing message
                    if (uploadMessage != null) {
                        uploadMessage.onReceiveValue(null);
                        uploadMessage = null;
                    }
    
                    uploadMessage = filePathCallback;
    
                    Intent intent = fileChooserParams.createIntent();
                    try {
                        startActivityForResult(intent, REQUEST_SELECT_FILE);
                    } catch (ActivityNotFoundException e) {
                        uploadMessage = null;
                        Toast.makeText(getApplicationContext(), "Cannot open file chooser", Toast.LENGTH_LONG).show();
                        return false;
                    }
    
                    return true;
                }
    
    
    
    
            });
    
    
        }
    
        @SuppressLint("NewApi")
        protected void onActivityResult(int requestCode, int resultCode, Intent data){
            if (requestCode == REQUEST_SELECT_FILE) {
                if (uploadMessage == null) return;
                uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
                uploadMessage = null;
            }
        }
    
        @Override
        public void onRefresh() {
    
            webView.reload();
            swipeRefreshLayout.setRefreshing(false);
            //adView.loadAd(adRequest);
        }
    
        void showInterAd()
        {
            interstitialAd.setAdListener(new AdListener(){
                @Override
                public void onAdLoaded() {
                    if(interstitialAd.isLoaded())
                        interstitialAd.show();
                }
            });
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if(keyCode== KeyEvent.KEYCODE_BACK)
            {
                if(webView.canGoBack()) {
                    webView.goBack();
                    adView.loadAd(adRequest);
                }else
                {
                    final AlertDialog alert = new AlertDialog.Builder(this).create();
                    alert.setTitle("Exit");
                    alert.setMessage("Are You Sure you want to Exit.");
                    alert.setButton(AlertDialog.BUTTON_POSITIVE,"Yes", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    });
                    alert.setButton(AlertDialog.BUTTON_NEGATIVE,"Cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            alert.dismiss();
                        }
                    });
                    alert.setButton(AlertDialog.BUTTON_NEUTRAL, "Home", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            webView.loadUrl("https://qarya.in/");
                            alert.dismiss();
                        }
                    });
    
                    alert.show();
                }
                return true;
            }
    
            return super.onKeyDown(keyCode, event);
        }
        // Open previous opened link from history on webview when back button pressed
    
        @Override
        // Detect when the back button is pressed
        public void onBackPressed() {
    
            if(webView.canGoBack()) {
                webView.goBack();
    
            } else {
                // Let the system handle the back button
                super.onBackPressed();
            }
        }
    
        public class Callback extends WebViewClient {
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
    
                pd.dismiss();
                if(!url.contains("qarya") || url.contains("facebook.com") || url.contains("twitter.com") || url.contains("linkedin.com") ||url.contains("whatsapp.com"))
                {
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    startActivity(intent);
                }
                else
                {
                    view.loadUrl(url);
                }
    
                return true;
    
    
            }
    
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Toast.makeText(getApplicationContext(), "Failed loading app!", Toast.LENGTH_SHORT).show();
                pd.dismiss();
            }
        }
    
    
    }
    
    0 讨论(0)
  • 2020-12-14 04:09

    This issue has already been asked and answered here: File Upload in WebView

    Also check this: https://code.google.com/p/android/issues/detail?id=62220

    You can use this class: https://github.com/delight-im/Android-AdvancedWebView

    0 讨论(0)
提交回复
热议问题