2017-05-18 27 views
5

Oto mój kod. Używam WebView do celów rejestracji. W procesie rejestracji muszę przesłać obraz z urządzenia. Skończyłem kod dla tego i działa poprawnie w każdej wersji Androida z wyjątkiem Marshmallow. Dałem wszystkie niezbędne pozwolenia z manifestu.Wybierz zdjęcie z galerii i aparatu przez widok internetowy nie działa w systemie Android 6.0 Marshmallow

Kod:

public class WebViewActivity extends Activity { 

private static final int INPUT_FILE_REQUEST_CODE = 1; 
private static final int FILECHOOSER_RESULTCODE = 1; 
private static final String TAG = WebViewActivity.class.getSimpleName(); 
private static final int TIME_DELAY = 2000; 
private static long back_pressed; 
private WebView webView; 
private WebSettings webSettings; 
private ValueCallback<Uri> mUploadMessage; 
private Uri mCapturedImageURI = null; 
private ValueCallback<Uri[]> mFilePathCallback; 
private String mCameraPhotoPath; 

@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; 
} 

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


    webView = (WebView) findViewById(R.id.webView1); 
    webSettings = webView.getSettings(); 
    webSettings.setAppCacheEnabled(true); 
    webSettings.setCacheMode(webSettings.LOAD_CACHE_ELSE_NETWORK); 
    webSettings.setJavaScriptEnabled(true); 
    webSettings.setLoadWithOverviewMode(true); 
    webSettings.setAllowFileAccess(true); 
    webView.setWebViewClient(new PQClient()); 
    webView.setWebChromeClient(new PQChromeClient()); 
    //if SDK version is greater of 19 then activate hardware acceleration otherwise activate software acceleration 
    if (Build.VERSION.SDK_INT >= 19) { 
     webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
    } else if (Build.VERSION.SDK_INT >= 11 && Build.VERSION.SDK_INT < 19) { 
     webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
    } 

    //webView.loadUrl("file:///android_asset/index.html"); 
    webView.loadUrl("http://wordpresstesting.in/parinaypahal/Website/basicInformation"); 
} 

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 
    File imageFile = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 
    return imageFile; 
} 

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    // Check if the key event was the Back button and if there's history 
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { 
     webView.goBack(); 
     return true; 
    } 
    // If it wasn't the Back key or there's no web page history, bubble up to the default 
    // system behavior (probably exit the activity) 

    return super.onKeyDown(keyCode, event); 
} 

@Override 
public void onBackPressed() { 

    if (back_pressed + TIME_DELAY > System.currentTimeMillis()) { 
     new AlertDialog.Builder(this) 
       .setIcon(R.drawable.alert) 
       .setTitle("Exit!") 
       .setMessage("Are you sure you want to close?") 
       .setPositiveButton("Yes", 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, 
               int which) { 

           finish(); 
          } 

         }).setNegativeButton("No", null).show(); 

    } 

    back_pressed = System.currentTimeMillis(); 

    if (webView.canGoBack()) { 
     webView.goBack(); 

    } else { 
     new AlertDialog.Builder(this) 
       .setIcon(R.drawable.alert) 
       .setTitle("Exit!") 
       .setMessage("Are you sure you want to close?") 
       .setPositiveButton("Yes", 
         new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, 
               int which) { 

           finish(); 
          } 

         }).setNegativeButton("No", null).show(); 
    } 

} 

public class PQChromeClient extends WebChromeClient { 

    // For Android 5.0 
    public boolean onShowFileChooser(WebView view, ValueCallback<Uri[]> filePath, 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"); 
     Log.d("File", "File: " + file); 
     mCapturedImageURI = Uri.fromFile(file); 

     // Camera capture image intent 
     final Intent captureIntent = new Intent(
       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); 
    } 

} 

public class PQClient extends WebViewClient { 
    ProgressDialog progressDialog; 

    public boolean shouldOverrideUrlLoading(WebView view, String url) { 

     // If url contains mailto link then open Mail Intent 
     if (url.contains("mailto:")) { 

      // Could be cleverer and use a regex 
      //Open links in new browser 
      view.getContext().startActivity(
        new Intent(Intent.ACTION_VIEW, Uri.parse(url))); 

      // Here we can open new activity 

      return true; 

     } else { 

      // Stay within this webview and load url 
      view.loadUrl(url); 
      return true; 
     } 
    } 

    //Show loader on url load 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 

     // Then show progress Dialog 
     // in standard case YourActivity.this 
     if (progressDialog == null) { 
      progressDialog = new ProgressDialog(WebViewActivity.this); 
      progressDialog.setMessage("Loading..."); 
      progressDialog.hide(); 
     } 
    } 

    // Called when all page resources loaded 
    public void onPageFinished(WebView view, String url) { 
     webView.loadUrl("javascript:(function(){ " + 
       "document.getElementById('android-app').style.display='none';})()"); 

     try { 
      // Close progressDialog 
      if (progressDialog.isShowing()) { 
       progressDialog.dismiss(); 
       progressDialog = null; 
      } 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
    } 
} 

manifest uprawnienia:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
+0

Znalazłeś rozwiązanie tego problemu? –

+0

Nie, jeszcze nie znalazłem. właściwie mój przyjaciel pyta mnie o to @Rostyslav Kinash – farhana

+1

Mam do czynienia z tym samym problemem, działa na 7.0, ale nie na 6.0, jeśli znalazłeś rozwiązanie, udostępnij – danielsalare

Odpowiedz

1

Pozwoli realizacji przesyłanie plików w większości wersji tym Marshmellow i jego przetestowany też. Ale nie pozwala na przesyłanie wielu plików.

Jeśli ktoś ma rozwiązanie dla tego proszę nie sugerować, że

public class MainActivity extends Activity { 

WebView mWebView; 

private static final int INPUT_FILE_REQUEST_CODE = 1; 
private static final int FILECHOOSER_RESULTCODE = 1; 
private static final String TAG = MainActivity.class.getSimpleName(); 
private ValueCallback<Uri> mUploadMessage; 
private Uri mCapturedImageURI = null; 
private ValueCallback<Uri[]> mFilePathCallback; 
private String mCameraPhotoPath; 

@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; 
} 

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES); 
    File imageFile = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 
    return imageFile; 
} 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_main); 

    mWebView = (WebView) findViewById(R.id.webview); 
    WebSettings webSettings = mWebView.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 

    mWebView.getSettings().setAllowFileAccess(true); 
    mWebView.loadUrl("url"); 

      mWebView.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return false; 
     } 
    }); 


    mWebView.setWebChromeClient(new 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_ALLOW_MULTIPLE,true); 
      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); 
     } 

    }); 


@Override 
public boolean onKeyDown(int keyCode, @NonNull KeyEvent event){ 
    String webUrl = mWebView.getUrl(); 

    if(event.getAction() == KeyEvent.ACTION_DOWN){ 
     switch(keyCode){ 
      case KeyEvent.KEYCODE_BACK: 
       if(mWebView.canGoBack()){ 
        if((webUrl.contains("url"))){ 
         new AlertDialog.Builder(this).setTitle("title") 
           .setIcon(R.mipmap.ic_launcher) 
           .setMessage("Are you sure you want to exit the app?") 
           .setPositiveButton("yes", new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface dialog, int which) { 

             Intent intent = new Intent(Intent.ACTION_MAIN); 
             intent.addCategory(Intent.CATEGORY_HOME); 
             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
             startActivity(intent); 
             finish(); 
            } 
           }).setNegativeButton("no", null).show(); 
        } 
        else 
        if((webUrl.contains("url"))){ 
         Toast.makeText(this, "Press the X button.", 
           Toast.LENGTH_SHORT).show(); 
        } 
        else 
        if((webUrl.contains("url")||(webUrl.contains("file:///android_asset/error_page.html")||webUrl.contains("url")))) { 
         new AlertDialog.Builder(this).setTitle("title") 
           .setIcon(R.mipmap.ic_launcher) 
           .setMessage("Are you sure you want to exit the app?") 
           .setPositiveButton("yes", new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface dialog, int which) { 

             Intent intent = new Intent(Intent.ACTION_MAIN); 
             intent.addCategory(Intent.CATEGORY_HOME); 
             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
             startActivity(intent); 
             finish(); 
            } 
           }).setNegativeButton("no", null).show(); 
        }else { 
         mWebView.goBack(); 
        } 
       }else { 
        new AlertDialog.Builder(this).setTitle("title") 
          .setIcon(R.mipmap.ic_launcher) 
          .setMessage("Are you sure you want to exit the app?") 
          .setPositiveButton("yes", new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 

            Intent intent = new Intent(Intent.ACTION_MAIN); 
            intent.addCategory(Intent.CATEGORY_HOME); 
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
            startActivity(intent); 
            finish(); 
           } 
          }).setNegativeButton("no", null).show(); 
       } 
       return true; 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 
} 
+0

To jest tylko działające rozwiązanie Próbowałem przesłać plik z przeglądarki internetowej. – Zafer

+0

z przyjemnością pomogę :) –

+0

Kiedy usuwasz obraz, który został utworzony w createImageFile()? – airowe

Powiązane problemy