0

У меня есть веб-просмотр, и на одной из страниц есть кнопка Загрузить фото. Я нашел код для реализации выбора файла (Android, почему так сложно ????), и если я выбираю галерею, все работает отлично. Если я выберу камеру 1 из 10 раз, она будет работать. Но большую часть времени, когда я делаю снимок и нажимаю «Сохранить» (это все в активности камеры), веб-просмотр загружает первую страницу, загруженную при запуске приложения. Кажется, что onActivityResult() не вызывается, а вместо него onCreate() есть и это испортит мое приложение. Можете ли вы дать мне пример того, как восстановить состояние webView после того, как я сделаю снимок? (возможно, я должен упомянуть, что я вошел в систему WebView).Android openFileChooser onCreate() вызывается после onActivityResult()

Это класс WebChromeClient:

public class WebViewChromeClient extends WebChromeClient { 
    private Activity activity; 
    public Uri imageUri; 

    private static final int FILECHOOSER_RESULTCODE = 1; 
    private Uri mCapturedImageURI = null; 

    private Context context; 

    private MainActivity mainActivity; 

    public WebViewChromeClient(Context context, Activity activity, 
      MainActivity mainActivity) { 
     this.activity = activity; 
     this.context = context; 
     this.mainActivity = mainActivity; 
    } 

    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { 

     // Update message 
     ((Audi) activity.getApplication()).setmUploadMessage(uploadMsg); 

     if (uploadMsg == null) { 
      Log.d("UPLOAD MESSAGE", "NULL"); 
     } 

     try { 
      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); 
      mainActivity.setmCapturedImageURI(mCapturedImageURI); 
      Log.d("Line", "57"); 
      // Camera capture image intent 
      final Intent captureIntent = new Intent(
        android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

      captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); 
      mainActivity.setmCapturedImageURI(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 
      activity.startActivityForResult(chooserIntent, 
        FILECHOOSER_RESULTCODE); 

     } catch (Exception e) { 
      Toast.makeText(context, "Exception:" + e, Toast.LENGTH_LONG).show(); 
     } 

    } 

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

    // The webPage has 2 filechoosers and will send a 
    // console message informing what action to perform,android wml_siso init 
    // taking a photo or updating the file 

    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", "Show console messages, Used for debugging: " 
     + message); 

    } 

} 

И это метод onActivityResult:

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
     Intent intent) { 

    webView.requestFocus(); 

    if (requestCode == FILECHOOSER_RESULTCODE) { 
     Log.d("MainActivity", "onActivityResult"); 

     if (null == ((Audi) getApplication()).getmUploadMessage()) { 
      Log.d("FileChooser Result", "58"); 
      return; 
     } 

     Log.d("MainActivity", "onActivityResult"); 
     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(); 
     } 

     ((Audi) getApplication()).getmUploadMessage().onReceiveValue(result); 
     ((Audi) getApplication()).setmUploadMessage(null); 
    } 
    Log.d("MainActivity", "onActivityResult"); 
} 
+0

_ [Здесь] (http://stackoverflow.com/questions/20424909/android-startcamera-gives-me-null-intent-and-does-it -destroy-my-global-varia) _ аналогичная ситуация описана с решением. –

+0

Я не понял, как сохранить состояние веб-просмотра и восстановить его. Если я верну его в onRestoreInstanceState(), страница не будет делать снимок с камеры. Не могли бы вы привести мне пример? – definera

+0

Подождите секунду. Почему 'onRestoreInstanceState()' конфликтует с камерой? Или вы не видите вызываемый 'onActivityResult()' в этом случае? –

ответ

1

Fixed, добавив следующую строку в Manifest android:configChanges="keyboardHidden|orientation|screenSize"

1

Ваша деятельность, вероятно, быть приостановлена ​​/ останавливали системы при запуске файла Chooser.

Вам необходимо обработать onResume() и восстановить состояние вашей активности. Метод onResume вызывается, когда ваша активность перезапускается, поэтому это хорошее место для перезагрузки любого WebView, который вы показывали, до запуска выбора файла.

+0

Что мне делать в onResume? – definera

+0

См. Мой отредактированный ответ. –

0

Глядя на Опубликованный коде, здесь опасно линия:

webView.requestFocus(); 

является первым в onActivityResult(). Если MainActivity воссоздается, это может вызвать NullPointerException. Система будет плавно перезапускать ваше приложение, возможно, создавая сообщаемое поведение.

Добавить еще Log.d() в начале onActivityResult(), положить попытаться/поймать вокруг этой опасной черты, и использования onSaveInstanceState() и onRestoreInstanceState().

Обратите внимание, что если ваш MainActivity - это портрет, вы сталкиваетесь с дополнительными неприятностями, с применением приложения для камеры.

Смежные вопросы