2017-05-18 80 views
5

İşte benim kodum. Kayıt amacıyla WebView kullanıyorum. Kayıt işleminde cihazdan bir görüntü yüklemem gerekiyor. Bunun için kodu bitirdim ve Marshmallow hariç her Android sürümünde düzgün çalışıyor. Bildiriden gerekli tüm izinleri verdim.Galeriden görüntü seç ve web kamerası aracılığıyla kamera çalışmıyor Android 6.0 Marshmallow

kodu:

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(); 
     } 
    } 
} 

tezahür izinleri:

<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

bunun için bir çözüm bulduk önermek? lütfen –

+0

no henüz bulunamadı. aslında arkadaşım bana bu @Rostyslav Kinash hakkında sormak – farhana

+1

Ben aynı sorunla karşılaşıyorum, 7.0 üzerinde çalışıyor ama 6.0, eğer çözüm bulduysanız, – danielsalare

cevap

1

Bu marshmellow ve çok test dahil çoğu sürümlerinde dosya yükleme uygulanması sağlayacaktır. Ancak, birden çok dosyayı yüklemeye izin vermez. Eğer kimse

bunun için bir çözüm

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

Bu sadece çalışma çözümü Webview dosyası yüklemeyi denedim. – Zafer

+0

Yardım etmekten mutluluk duyuyorum :) –

+0

CreateImageFile() 'de oluşturulan görüntüyü ne zaman silersiniz? – airowe