6

私のアプリはウェブベースで、INPUT フィールド キャンプから写真をアップロードする必要があります。私には2つの状況があり、ページによっては別の方法がわからないため、URL請願に応じて「boolean boolFileChoser」を使用してどちらかを選択しています。

a. ファイルピッカー

b. カメラ写真撮影。

ファイルピッカーを扱ったところ、ファイルが完全にアップロードされました。問題はカメラにあります。カメラ写真をアップロードしようとすると、クラッシュします。私の知る限り、URIが原因です。

a) ファイル ピッカー: content://media/external/images/1234

b) カメラ撮影: file:///mnt/sdcard/Pic.jpg

変更する方法が見つかりませんでした。

アップデートを見る

「content://media/external/images/1234」をアップロードしようとしているときに nullpointerexception が発生したため、クラッシュするようになりました。(ファイルチューザではなく、カメラのみ)。また、セレクター/カメラが閉じている場合 (戻るボタン)、再度呼び出すことはできません。

ケース a) および b) 100% 動作します。fileChooser または camera が呼び出されたかどうかを知る方法を含む、動作するコードは次のとおりです。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (resultCode != RESULT_OK) {
    /** fixed code **/
            //To be able to use the filechooser again in case of error
            mUploadMessage.onReceiveValue(null);
    /** fixed code **/
            return;
    }
    if (mUploadMessage==null) {
        Log.d("androidruntime","no mUploadMessage");
        return;
    }
    if (requestCode == FILECHOOSER_RESULTCODE) {
        Uri selectedImage= intent == null || resultCode != RESULT_OK ? null : intent.getData();
        Log.d("androidruntime","url: "+selectedImage.toString());

    }else if (requestCode == CAMERAREQUEST_RESULTCODE) { 
        if(mCapturedImageURI==null){
            Log.d("androidruntime","no mCapturedImageURI");
            return;
        }
      /** fixed code **/
        getContentResolver().notifyChange(mCapturedImageURI, null);
        ContentResolver cr = getContentResolver();
        Uri uriContent= Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), photo.getAbsolutePath(), null, null));
        photo = null;
      /** fixed code **/
    }
    mUploadMessage.onReceiveValue(selectedImage);
    mUploadMessage = null;
}


    private static final int FILECHOOSER_RESULTCODE   = 2888;
    private static final int CAMERAREQUEST_RESULTCODE = 1888;
    private ValueCallback<Uri> mUploadMessage;
    private Uri mCapturedImageURI = null;

    protected class AwesomeWebChromeClient extends WebChromeClient{
        // Per Android 3.0+
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType){  
           /**updated, out of the IF **/
                            mUploadMessage = uploadMsg;
           /**updated, out of the IF **/
            if(boolFileChooser){ //Take picture from filechooser

                Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
                i.addCategory(Intent.CATEGORY_OPENABLE);  
                i.setType("image/*");  
                MainActivity.this.startActivityForResult( Intent.createChooser( i, "Escoger Archivo" ), MainActivity.FILECHOOSER_RESULTCODE );  

            } else { //Take photo and upload picture
                Intent cameraIntent = new Intent("android.media.action.IMAGE_CAPTURE");
                File photo = new File(Environment.getExternalStorageDirectory(),  "Pic.jpg");
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                        Uri.fromFile(photo));
                mCapturedImageURI = Uri.fromFile(photo);
                startActivityForResult(cameraIntent, MainActivity.CAMERA_REQUEST);
            }
        }
        // Per Android < 3.0
        public void openFileChooser(ValueCallback<Uri> uploadMsg){
            openFileChooser(uploadMsg, "");
        }
        //Altre
        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
            openFileChooser(uploadMsg, "");
        }



        /** Added code to clarify chooser. **/

        //The webPage has 2 filechoosers and will send a console message informing what action to perform, 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", "Per cònsola: " + cm.message());
            if(message.endsWith("foto")){ boolFileChooser= true; }
            else if(message.endsWith("pujada")){ boolFileChooser= false; }
        }
        /** Added code to clarify chooser. **/



    }

更新 1

「content://media/external/images/xxx」形式の uri を取得できましたが、「mUploadMessage.onReceiveValue(selectedImage);」を介して uri をアップロードしようとするとアプリがクラッシュします。今、nullpointerexception が発生しています。


更新 2

修正され、動作しています。

ファイル選択の場合にのみ、ローカル変数に「ValueCallback uploadMsg」があったため、写真ファイルをアップロードしようとすると、null だったために常に例外がスローされました。if-else ステートメントから取り出したら、すべてが機能しました。以前の更新は、ファイルのアップロードを処理する最も簡単な方法でした。

私はすでに「mUploadMessage.onReceiveValue(null);」を追加しました。Camera/filechooser インテントがキャンセルされた場合 (Web ページで処理する必要があります)、そうでない場合は、INPUT フィールド (インテント) を再度起動することはできません。


更新 3

オプションを識別し、写真を撮るか、ファイルを選択するために、AwesomeChromeClient内のコードの一部を追加しました..それは私のやり方であり、請願によって追加されました.それを行うには他にも多くの有効な方法があると確信しています.

コードは機能的に 100% になりました。画像またはファイルチューザーが必要かどうかを指定した場合

4

3 に答える 3

2

解決しました。私の質問の中には、誰かがそれを必要とする場合に備えて機能コードがあります。

問題の解決策は次のとおりです。

  1. 以前に開いてキャンセルした場合、カメラ/ファイルチューザーを開くことができませんでした:

    //inside onActivityResult
    if (resultCode != RESULT_OK) {
         mUploadMessage.onReceiveValue(null);
         return;
    }
    
  2. "content://media/external/images/xxx" uri 形式を取得し、"mUploadMessage.onReceiveValue(selectedImage);" を介して uri をアップロードし、nullpointerexception を回避します。

    //inside OnActivityResult
    getContentResolver().notifyChange(mCapturedImageURI, null);
    ContentResolver cr = getContentResolver();
    Uri uriContent = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), photo.getAbsolutePath(), null, null));
    
于 2013-03-17T19:12:20.410 に答える
2

解決され、正常に動作しています。

WebChromeClient クラスのコードを見てください。パラメータが以前から変更されていることがわかります。

public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
                       throw new RuntimeException("Stub!");
    }

解決:

この github リンクの最新の ChromeBrowser コードに従うだけです Github の Android Chrome ブラウザ コード

プロジェクトに同じ github コードを使用します。

注: Android 4.4 KitKat バージョンにはまだ問題があります。Android 4.4を除いて、他のバージョンのAndroidでも問題なく動作します。

これはまだ Google からの未解決の欠陥であるためです。以下のリンクでご確認ください。

Android 4.4 WebViewでクリックしたときにopenFileChooserが呼び出されない

于 2015-08-21T12:00:17.233 に答える