30

このアプリの WebView は、アップロード ボタンのあるページを開きます。

アップロード ボタンのある webview のページ

以下は、ギャラリーまたはカメラから画像をアップロードするためのダイアログ ボックスを開くためのコード ブロックです。

私のアクティビティ内には次のものがあります。

 private WebView wv;  

//make HTML upload button work in Webview   
 private ValueCallback<Uri> mUploadMessage;  
 private final static int FILECHOOSER_RESULTCODE=1;

 @Override  
 protected void onActivityResult(int requestCode, int resultCode, Intent intent) {  
  if(requestCode==FILECHOOSER_RESULTCODE)  
  {  
   if (null == mUploadMessage) return;  
            Uri result = intent == null || resultCode != RESULT_OK ? null  
                    : intent.getData();  
            mUploadMessage.onReceiveValue(result);  
            mUploadMessage = null;        
  }  
 }  

onCreate 内には、次のものがあります。

    wv.setWebChromeClient(new WebChromeClient()  {
        private Uri imageUri;   

        public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType )  {      
             File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp");
            // Create the storage directory if it does not exist
            if (! imageStorageDir.exists()){
                imageStorageDir.mkdirs();                  
            }
            File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg");  
            imageUri = Uri.fromFile(file); 

            final List<Intent> cameraIntents = new ArrayList<Intent>();
            final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            final PackageManager packageManager = getPackageManager();
            final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
            for(ResolveInfo res : listCam) {
                final String packageName = res.activityInfo.packageName;
                final Intent i = new Intent(captureIntent);
                i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                i.setPackage(packageName);
                i.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                cameraIntents.add(i);

            }


            mUploadMessage = uploadMsg; 
            Intent i = new Intent(Intent.ACTION_GET_CONTENT);  
            i.addCategory(Intent.CATEGORY_OPENABLE);  
            i.setType("image/*"); 
            Intent chooserIntent = Intent.createChooser(i,"Image Chooser");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
            MainActivity.this.startActivityForResult(chooserIntent,  FILECHOOSER_RESULTCODE); 
        }

[アップロード] ボタンをクリックすると、カメラ、画像ギャラリー、ファイル エクスプローラーのオプションが表示されます。 カメラ、ギャラリー、ファイル エクスプローラーのアップロード オプション

ファイル エクスプローラーとギャラリーは期待どおりに動作しています。問題は、カメラを使用して写真を撮ると、「ファイルが選択されていません」というステータスを示す「ファイルを選択」オプションにアップロードされないことです。

カメラの選択について:

カメラ

カメラを使用してスナップショットを撮る場合:戻るオプションとチェック オプションが表示されます。

カメラを使用したスナップショット

チェックマークの選択について:

ファイルがアップロードされていません:(「ファイルを選択」オプションで

ここに画像の説明を入力

期待されること:

アップロードされた画像

適切な書き込み権限があることを確認したため、「MyApp」という名前のディレクトリが生成され、その中に写真が保存されます (Web ページのアップロード ボタンをクリックした後にカメラを起動して撮影した場合)。

チェックマークを押した後、カメラから撮影した写真 (MyApp ディレクトリに保存されたもの) を選択するようにアプリケーションにプログラムで指示する方法は?

4

5 に答える 5

4

私の英語で申し訳ありません。

これは解決策です。

まず、ファイル メンバーを次のように定義します。

public File mTempFile;

あなたの開いているファイル選択は問題ありません。

onActivityResult方法はとても重要です。

カメラ アプリは URL を返しませんが、ValueCallback には URL が必要です。

mTempFile から URI を取得します。

これは仕事です。

私はこれが好きです。

if ( mTempFile.exists() ) {

    mUploadMessage.onReceiveValue(Uri.fromFile(mTempFile));
    mUploadMessage = null;

} else {

    mUploadMessage.onReceiveValue(result);
    mUploadMessage = null;
}

カメラと呼ばれる mTempFile が存在する場合、それ以外の場合はギャラリーから。

于 2014-04-22T01:05:33.147 に答える
3

android:launchMode="singleInstance"マニフェストファイルに含まれていないことを確認してください

于 2013-05-14T12:40:17.833 に答える