私のアプリはウェブベースで、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% になりました。画像またはファイルチューザーが必要かどうかを指定した場合