2016-06-10 23 views
-1

Ich weiß, dass diese Frage hier oft gestellt wird, aber ich habe gerade begonnen Android-Entwicklung, so dass verwirrt, diese Lösungen anzuwenden. Mit meinem Code FileUpload Option funktioniert nicht. Die Datei wird nicht geöffnet, wenn Sie das Dialogfeld auswählen. Bitte helfen Sie mirFileUpload funktioniert nicht innerhalb von Android WebView

public class MainActivity extends Activity { 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      WebView mWebView = (WebView) findViewById(R.id.activity_main_webview); 
      WebSettings webSettings = mWebView.getSettings(); 
      webSettings.setJavaScriptEnabled(true); 
      mWebView.setWebViewClient(new WebViewClient()); 
      mWebView.loadUrl("http://google.com"); 
     } 
    } 

Antwort

1
// variables for camera and choosing files methods 
private static final int FILECHOOSER_RESULTCODE = 1; 
private ValueCallback<Uri> mUploadMessage; 
private Uri mCapturedImageURI = null; 
// the same for Android 5.0 methods only 
private ValueCallback<Uri[]> mFilePathCallback; 
private String mCameraPhotoPath; 
private class DefaultWebViewClient extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 
    } 
} 
    @Override 
public void onActivityResult (int requestCode, int resultCode, Intent data) { 
    // code for all versions except of Lollipop 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 
     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 = data == null ? mCapturedImageURI : data.getData(); 
       } 
      } 
      catch(Exception e) { 
       Toast.makeText(getApplicationContext(), "activity :"+e, Toast.LENGTH_LONG).show(); 
      } 
      mUploadMessage.onReceiveValue(result); 
      mUploadMessage = null; 
     } 
    } // end of code for all versions except of Lollipop 
    // start of code for Lollipop only 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     if (requestCode != FILECHOOSER_RESULTCODE || mFilePathCallback == null) { 
      super.onActivityResult(requestCode, resultCode, data); 
      return; 
     } 
     Uri[] results = null; 
     // check that the response is a good one 
     if (resultCode == Activity.RESULT_OK) { 
      if (data == null || data.getData() == null) { 
       // if there is not data, then we may have taken a photo 
       if (mCameraPhotoPath != null) { 
        results = new Uri[]{Uri.parse(mCameraPhotoPath)}; 
       } 
      } else { 
       String dataString = data.getDataString(); 
       if (dataString != null) { 
        results = new Uri[]{Uri.parse(dataString)};} 
       } 
     } 
    mFilePathCallback.onReceiveValue(results); 
     mFilePathCallback = null; 
    } // end of code for Lollipop only 
    } 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     WebView mWebView = (WebView) findViewById(R.id.webview); 
     WebSettings webSettings = mWebView.getSettings(); 
     webSettings.setSavePassword(true); 
     webSettings.setSaveFormData(true); 
     webSettings.setJavaScriptEnabled(true); 
     webSettings.setSupportZoom(true); 
     webSettings.setDomStorageEnabled(true); 
     webSettings.setAllowContentAccess(true); 
     webSettings.setAllowFileAccess(true); 
     mWebView.setWebViewClient(new DefaultWebViewClient()); 
    mWebView.setWebChromeClient(new WebChromeClient() 
     { 
      // for Lollipop, all in one 
      public boolean onShowFileChooser(
        WebView webView, ValueCallback<Uri[]> filePathCallback, 
        WebChromeClient.FileChooserParams fileChooserParams) { 
       if (mFilePathCallback != null) { 
        mFilePathCallback.onReceiveValue(null); 
       } 
       mFilePathCallback = filePathCallback; 
       Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      File photoFile = null; 
        try { 
         photoFile = createImageFile(); 
         takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath); 
        } catch (IOException ex) { 
         // Error occurred while creating the File 
         Log.e(TAG, "Unable to create Image File", ex); 
        } 
        if (photoFile != null) { 
         mCameraPhotoPath = "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, "Choose"); 
       chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); 
       startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE); 
       return true; 
      } 
      private File createImageFile() throws IOException { 
       File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "DirectoryNameHere"); 
       if (!imageStorageDir.exists()) { 
        imageStorageDir.mkdirs(); 
       } 
       // create an image file name 
       imageStorageDir = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg"); 
       return imageStorageDir; 
      } 
      // openFileChooser for Android 3.0+ 
      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { 
       mUploadMessage = uploadMsg; 
       try { 
        File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "DirectoryNameHere"); 
        if (!imageStorageDir.exists()) { 
         imageStorageDir.mkdirs(); 
        } 
        File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg"); 
        mCapturedImageURI = Uri.fromFile(file); // save to the private variable 
        final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
        captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 
        // captureIntent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
        Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
        i.addCategory(Intent.CATEGORY_OPENABLE); 
        i.setType("*/*"); 
        Intent chooserIntent = Intent.createChooser(i, "Choose"); 
       chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{captureIntent}); 
        startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE); 
       } catch (Exception e) { 
        Toast.makeText(getBaseContext(), "Camera Exception:" + e, Toast.LENGTH_LONG).show(); 
       } 
      } 
      // openFileChooser for Android < 3.0 
      public void openFileChooser(ValueCallback<Uri> uploadMsg) { 
       openFileChooser(uploadMsg, ""); 
      } 
      // openFileChooser for other Android versions 
     /* may not work on KitKat due to lack of implementation of openFileChooser() or onShowFileChooser() 
      https://code.google.com/p/android/issues/detail?id=62220 
      however newer versions of KitKat fixed it on some devices */ 
      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { 
       openFileChooser(uploadMsg, acceptType); 
      } 
     }); 
     mWebView.loadUrl("http://google.com"); 
    }   
+0

Beide sind unterschiedliche Code oder alternativ voneinander? – SUN

+0

Nein, Sie müssen beide verwenden. openfilechooser sollte aufgerufen werden, und dann muss die ausgewählte Datei ein Aktivitätsresultat erhalten. – user3278732

+0

Und seit ich gerade angefangen habe. Wo muss ich diesen Code in die Nebenaktivitäten aufnehmen? – SUN

Verwandte Themen