Android openFileChooser onCreate() вызывается после onActivityResult()

У меня есть веб-просмотр, и на одной из страниц есть кнопка "Загрузить фото". Я нашел некоторый код для реализации выбора файлов (Android, почему так сложно????), и если я выбираю галерею, все работает нормально. Если я выберу камеру 1 из 10 раз, это работает. Но большую часть времени, когда я делаю снимок и нажимаю кнопку "Сохранить" (это все относится к работе с камерой), веб-просмотр загружает первую страницу, загруженную при запуске приложения. Кажется, что 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");
}

3 ответа

Решение

Исправлено добавлением этой строки в Манифест android:configChanges="keyboardHidden|orientation|screenSize"

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

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

Глядя на ваш размещенный код, вот опасная строка:

webView.requestFocus();

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

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

Обратите внимание, что если у вас MainActivity " Портрет", вы столкнетесь с дополнительными проблемами, так как приложение "Камера" заставит альбомную ориентацию.

Другие вопросы по тегам