0

我有一个web视图,并在其中一个页面上有一个上传照片按钮。我发现一些代码来实现文件选择器(Android,为什么这么难?),如果我选择一切正常工作。如果我选择10倍的相机1的作品。但大多数情况下,当我拍摄照片并单击保存时(这全部在相机活动中),webview加载启动应用程序时加载的第一个页面。似乎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

我不明白如何保存webview状态并将其恢复。如果我在onRestoreInstanceState()中恢复它,页面不会从相机拍摄照片。您是否会举例说明? – definera

+0

等一下。为什么'onRestoreInstanceState()'与相机冲突?或者,你没有看到在这种情况下调用的'onActivityResult()'? –

回答

1

通过在清单android:configChanges="keyboardHidden|orientation|screenSize"

1

你的活动可能被暂停/由系统停止,而你运行该文件选择器。

您需要处理onResume()并恢复您活动的先前状态。当您的活动重新启动时,将调用onResume方法,因此这是在启动文件选择器之前重新加载您显示的任何WebView的好地方。

+0

10我应该在onResume中做什么? – definera

+0

请参阅我编辑的答案。 –

0

看您发布的代码,这里是一个危险的线:

webView.requestFocus(); 

是首次在onActivityResult()。如果MainActivity正在重新创建,这可能会导致空指针异常。系统将无缝地重新启动您的应用程序,可能会产生报告的行为。

另一个Log.d()加入的onActivityResult()开始,把try/catch语句解决这个危险的线路,的onSaveInstanceState使用()和onRestoreInstanceState()。

请注意,如果您的MainActivity是肖像,您将面临额外的麻烦,相机应用强制横向。

相关问题