webview应用程序:选择文件不起作用

时间:2019-04-01 08:51:00

标签: android webview android-webview

我正在设置我的Webview应用程序,我希望“选择文件”按钮能够从手机上载图片,但是现在该按钮没有任何功能或不起作用。请任何人能帮助我,谢谢您!

这是来自MainActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    webView = (WebView) findViewById(R.id.webview);
    webView.setWebViewClient(new WebViewClient());
    webView.loadUrl("https://example.com");
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
}

@Override
public void onBackPressed() {
    if (webView.canGoBack()) {
        webView.goBack();
    } else {
        super.onBackPressed();
    }
}

}

这是来自AndroidManifest:

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



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

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

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    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>
</application>

2 个答案:

答案 0 :(得分:2)

按照下面的代码

public class MainActivity extends Activity {

private WebView webView;
private String urlStart = "http://www.example.com/mobile/";

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

//Camera parameters
private Uri mCapturedImageURI = null;

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

webView = (WebView) findViewById(R.id.webView);

webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);

webView.getSettings().setAllowFileAccess(true);

webView.loadUrl(urlStart);

webView.setWebChromeClient(new WebChromeClient() {
    // openFileChooser for Android 3.0+
    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { 

        mUploadMessage = uploadMsg;

        try{
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File externalDataDir = Environment.getExternalStoragePublicDirectory(
                      Environment.DIRECTORY_DCIM);
            File cameraDataDir = new File(externalDataDir.getAbsolutePath() +
                      File.separator + "browser-photos");
            cameraDataDir.mkdirs();
            String mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator +
                      System.currentTimeMillis() + ".jpg";
            mCapturedImageURI = Uri.fromFile(new File(mCameraFilePath));

            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);

            Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType("image/*");

            Intent chooserIntent = Intent.createChooser(i, "Image Chooser");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[] { cameraIntent });

            startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
          }
         catch(Exception e){
             Toast.makeText(getBaseContext(), "Camera Exception:"+e, Toast.LENGTH_LONG).show();
         }
       }

    // For Android < 3.0
   @SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg ) {
           openFileChooser(uploadMsg, "");
       }

// For Android  > 4.1.1
    @SuppressWarnings("unused")
    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
           openFileChooser(uploadMsg, acceptType);
       }

       public boolean onConsoleMessage(ConsoleMessage cm) {        
           onConsoleMessage(cm.message(), cm.lineNumber(), cm.sourceId());
           return true;
       }
       public void onConsoleMessage(String message, int lineNumber, String sourceID) 
  {
           Log.d("androidruntime", "www.example.com: " + message);
         }
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
// TODO Auto-generated method stub
if(requestCode==FILECHOOSER_RESULTCODE){  
        if (null == this.mUploadMessage) {
            return;
        }

       Uri result=null;

       try{
            if (resultCode != RESULT_OK) {
                result = null;

            } else {
                // retrieve from the private variable if the intent is null
                result = intent == null ? mCapturedImageURI : intent.getData(); 
            } 
        } catch(Exception e) {

            Toast.makeText(getApplicationContext(), "activity :"+e, Toast.LENGTH_LONG).show();
        }

        mUploadMessage.onReceiveValue(result);
        mUploadMessage = null;
 }

}

答案 1 :(得分:0)

您必须将 WebChromeClient 设置为“在网络视图中选择文件”

代码在这里

public class WebViewActivity extends AppCompatActivity {

private WebView webView;
private String url = "www.example.com";
private ValueCallback<Uri> msgUpload;
private final static int CHOOSER_FILE_RESULT_CODE = 100;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_webview);

    initViews();
    setListeners();
}

private void initViews() {
    webView = findViewById(R.id.webView);
    webView.getSettings().setLoadsImagesAutomatically(true);
    webView.setInitialScale(1);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setDisplayZoomControls(false);
    webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    webView.setWebViewClient(new WebViewClient());
    webView.getSettings().setAllowFileAccess(true);

}

private void setListeners()
{
  webView.setWebViewClient(new WebViewClient() {
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {

            webView.loadUrl("about:blank");

            view.clearHistory();
        }


    });

    webView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {


        }

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

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

        }


    });



        webView.loadUrl(url);


    final MyJavaScriptInterface myJavaScriptInterface
            = new MyJavaScriptInterface(this);
    webView.addJavascriptInterface(myJavaScriptInterface, "AndroidFunction");

}

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub

    if (webView.canGoBack() == true) {
        webView.goBack();
    } else {
        super.onBackPressed();
    }
}

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

public class MyJavaScriptInterface {
    Context mContext;

    MyJavaScriptInterface(Context c) {
        mContext = c;
    }

    @JavascriptInterface
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
    }

    @JavascriptInterface
    public void openAndroidDialog() {
        AlertDialog.Builder myDialog
                = new AlertDialog.Builder(WebViewActivity.this);
        myDialog.setTitle("DANGER!");
        myDialog.setMessage("You can do what you want!");
        myDialog.setPositiveButton("ON", null);
        myDialog.show();
    }

}
相关问题