【问题标题】:Android openFileChooser onCreate() called after onActivityResult()在 onActivityResult() 之后调用的 Android openFileChooser onCreate()
【发布时间】:2014-07-16 13:15:49
【问题描述】:

我有一个网页视图,其中一个页面上有一个上传照片按钮。我找到了一些代码来实现文件选择器(Android,为什么这么难????),如果我选择画廊一切正常。如果我选择 10 次中的第 1 台相机,它可以工作。但大多数时候,当我拍照并单击保存(这都是在相机活动中)时,webview 会加载应用程序启动时加载的第一页。似乎没有调用onActivityResult(),而是调用了onCreate(),这弄乱了我的应用程序。可以举个例子说明我拍照后如何恢复webView的状态吗? (也许我应该提到我在 WebView 中登录)。

这是 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");
}

【问题讨论】:

  • Here描述了类似的情况,有解决办法。
  • 我不明白如何保存和恢复 webview 状态。如果我在 onRestoreInstanceState() 中恢复它,页面不会从相机中拍照。你能给我举个例子吗?
  • 等一下。为什么onRestoreInstanceState() 与摄像头冲突?或者,您没有看到在这种情况下调用了 onActivityResult()
  • 大多数时候 onActivityResult() 不会被调用,但 onCreate() 会被调用。
  • 我从未见过onActivityResult() 根本没有被调用。有时,它会在您最不期望的时候被调用,或者使用您无法想象的 requestCode/resultCode 组合来调用它。仔细检查您的日志。

标签: android android-intent android-camera onactivityresult onrestoreinstancestate


【解决方案1】:

在您运行文件选择器时,系统可能会暂停/停止您的活动。

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

【讨论】:

  • onResume 中应该做什么?
【解决方案2】:

已通过在 Manifest android:configChanges="keyboardHidden|orientation|screenSize" 中添加此行来修复

【讨论】:

    【解决方案3】:

    查看您发布的代码,这是一条危险的行:

    webView.requestFocus();
    

    onActivityResult() 中排在第一位。如果正在重新创建 MainActivity,这可能会导致 NullPointerException。系统将无缝地重新启动您的应用,可能会产生报告的行为。

    onActivityResult() 的开头添加另一个 Log.d(),将 try/catch 放在这条危险线附近,使用 onSaveInstanceState() 和 onRestoreInstanceState()。

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

    【讨论】:

      猜你喜欢
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多