2016-07-26 3 views
2

Ich entwickle ein Webview. Beim Anhängen einer Datei funktioniert die Dateiauswahl nur mit der Galerie, aber nicht mit der Kamera. Wenn ich eine Datei anschließe, zeigt die App die Option für Galerie und Kamera an. Aber wenn ich Kamera auswähle, passiert nichts. Ich habe mehrere andere Quellen mit fast ähnlichen Problemen gefunden. Aber die Lösung hilft mir nicht.Dateiauswahl aus der Galerie Arbeit, aber es funktioniert nicht mit der Kamera in android webview

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 

     if (requestCode != INPUT_FILE_REQUEST_CODE || 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) { 
       // 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; 

    } else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { 
     if (requestCode != FILECHOOSER_RESULTCODE || mUploadMessage == null) { 
      super.onActivityResult(requestCode, resultCode, data); 
      return; 
     } 

     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; 

     } 
    } 

    return; 
} 

Hier In WebChromeClient:

public class MyWebChromeClient extends WebChromeClient{ 
    // For Android 5.0 
    public boolean onShowFileChooser(WebView view, ValueCallback<Uri[]> filePath, WebChromeClient.FileChooserParams fileChooserParams) { 



     // Double check that we don't have any existing callbacks 
     if (mFilePathCallback != null) { 
      mFilePathCallback.onReceiveValue(null); 
     } 
     mFilePathCallback = filePath; 

     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      // Create the File where the photo should go 
      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); 
      } 

      // Continue only if the File was successfully created 
      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("image/*"); 

     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, INPUT_FILE_REQUEST_CODE); 

     return true; 

    } 

    // openFileChooser for Android 3.0+ 
    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { 

     mUploadMessage = uploadMsg; 
     // Create AndroidExampleFolder at sdcard 
     // Create AndroidExampleFolder at sdcard 

     File imageStorageDir = new File(
       Environment.getExternalStoragePublicDirectory(
         Environment.DIRECTORY_PICTURES) 
       , "AndroidExampleFolder"); 

     if (!imageStorageDir.exists()) { 
      // Create AndroidExampleFolder at sdcard 
      imageStorageDir.mkdirs(); 
     } 

     // Create camera captured image file path and name 
     File file = new File(
       imageStorageDir + File.separator + "IMG_" 
         + String.valueOf(System.currentTimeMillis()) 
         + ".jpg"); 

     mCapturedImageURI = Uri.fromFile(file); 

     // Camera capture image intent 
     final Intent captureIntent = new Intent(
       android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

     captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 

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

     // Create file chooser intent 
     Intent chooserIntent = Intent.createChooser(i, "Image Chooser"); 

     // Set camera intent to file chooser 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS 
       , new Parcelable[] { captureIntent }); 

     // On select image call onActivityResult method of activity 
     startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE); 


    } 

    // openFileChooser for Android < 3.0 
    public void openFileChooser(ValueCallback<Uri> uploadMsg) { 
     openFileChooser(uploadMsg, ""); 
    } 

    //openFileChooser for other Android versions 
    public void openFileChooser(ValueCallback<Uri> uploadMsg, 
           String acceptType, 
           String capture) { 

     openFileChooser(uploadMsg, acceptType); 
    } 

} 


For Image: 
private File createImageFile() throws IOException { 
    // Create an image file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = "JPEG_" + timeStamp + "_"; 


      java.io.File xmlFile = new java.io.File((getBaseContext() 
      .getApplicationContext().getFileStreamPath("FileName.xml") 
      .getPath())); 
    return xmlFile; 
} 

Antwort

0

This ist hilfreich für mich. Aber die Kamera funktioniert nicht für Nexus 5. Dazu verwende ich den folgenden Code an onActivity Methode:

if (resultCode == Activity.RESULT_OK) { 
     if (data == null || data.getDataString() == 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)}; 
      } 
     } 
    } 

Ich füge diese: if (data == null || data.getDataString() == null) {...}

1

Meiner Meinung nach sollten Sie über die Camera Intents bewusst sein. Ich denke, das wird Ihr Problem lösen. Dies hilft, Fotos von Kameras aufzunehmen.

Verwandte Themen