在我的Web应用程序中,我正在加载一个页面,其中有一个按钮可以调用相册/照片库,但它根本不工作。请帮忙,这是我目前的代码。
webView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.setScrollbarFadingEnabled(false);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setSupportZoom(true);
webView.addJavascriptInterface(new MyJavascriptInterface(this), "Android");
webView.loadUrl("https://URL/");
并在现场创建
class MyJavascriptInterface
{
Context mContext;
/** Instantiate the interface and set the context */
MyJavascriptInterface(Context c)
{
mContext = c;
}
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast)
{
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
}
@JavascriptInterface
public String choosePhoto()
{
// TODO Auto-generated method stub
String file = "test";
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);
return file;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent)
{
switch (requestCode)
{
case SELECT_PHOTO:
if (resultCode == RESULT_OK)
{
Uri selectedImage = intent.getData();
webView.loadUrl("javascript:setFileUri('" + selectedImage.toString() + "')");
String path = getRealPathFromURI(this, selectedImage);
webView.loadUrl("javascript:setFilePath('" + path + "')");
}
}
}
public String getRealPathFromURI(Context context, Uri contentUri)
{
Cursor cursor = null;
try
{
String[] proj = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
finally
{
if (cursor != null)
{
cursor.close();
}
}
}
在清单文件里
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
我需要访问照片/相机,使用简单的网络视图从图库中选择图像。请原谅我的英语和代码,因为我还是一个学习者,对android开发还不熟悉。
我认为你最好在WebChromeClient$onShowFileChooser中这样做。
在你的代码中,你应该在主线程中这样做。试着在你选择的照片方法中添加runOnUIThread。
在这里添加演示(构建。VERSION_CODES在LOLLIPOP下面使用不同的方法):
public class MyChromeCientWithFileChooser extends WebChromeClient implements ActivityResultCaseDelegate {
private int FILE_CHOOSER_REQUEST_CODE = 1001;
private Activity activity;
private ValueCallback<Uri[]> filePathCallback;
private Uri mediaUri;
public MyChromeCientWithFileChooser(Activity activity) {
this.activity = activity;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
String type;
if (fileChooserParams != null && fileChooserParams.getAcceptTypes() != null && fileChooserParams.getAcceptTypes().length > 0) {
type = !TextUtils.isEmpty(fileChooserParams.getAcceptTypes()[0]) ? fileChooserParams.getAcceptTypes()[0] : "*/*" ;
this.filePathCallback = filePathCallback;
} else {
return false;
}
proceedOnType(type, fileChooserParams.isCaptureEnabled());
return true;
}
private void proceedOnType(String type, final boolean isCaptureEnabled) {
if (type.toLowerCase().contains("image")) {
pickImage(isCaptureEnabled); // need to make sure you have "android.permission.CAMERA", "android.permission.WRITE_EXTERNAL_STORAGE" permission
} else if (type.toLowerCase().contains("video")) {
makeVideo(); // need to make sure you have "android.permission.CAMERA", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.RECORD_AUDIO" permission
} else {
openDefaultChooser(type); // need to make sure you have "android.permission.WRITE_EXTERNAL_STORAGE" permission
}
}
private void openDefaultChooser(String type) {
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType(type);
activity.startActivityForResult(Intent.createChooser(i, "File Chooser"), FILE_CHOOSER_REQUEST_CODE);
}
private void pickImage(boolean captureOnly) {
if (captureOnly) {
Intent iImageCapture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
mediaUri = Uri.fromFile(new File(getImageCaptureCachePath()));
iImageCapture.putExtra("output", mediaUri);
activity.startActivityForResult(Intent.createChooser(iImageCapture, "Image Chooser"), FILE_CHOOSER_REQUEST_CODE);
} else {
Intent iChooseImage = new Intent(Intent.ACTION_GET_CONTENT);
iChooseImage.addCategory(Intent.CATEGORY_OPENABLE);
iChooseImage.setType("image/*");
Intent iImageCapture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
mediaUri = Uri.fromFile(new File(getImageCaptureCachePath()));
iImageCapture.putExtra("output", mediaUri);
Intent iChooser = Intent.createChooser(iChooseImage, "Pick a photo");
iChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{iImageCapture});
activity.startActivityForResult(Intent.createChooser(iChooser, "Image Chooser"), FILE_CHOOSER_REQUEST_CODE);
}
}
private void makeVideo() {
Intent iImageCapture = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
mediaUri = Uri.fromFile(new File(getVideoCaptureCachePath()));
iImageCapture.putExtra("output", mediaUri);
activity.startActivityForResult(Intent.createChooser(iImageCapture, "Image Chooser"), FILE_CHOOSER_REQUEST_CODE);
}
private String getImageCaptureCachePath() {
return "cahced_photo_" + System.currentTimeMillis() + ".jpg";
}
private String getVideoCaptureCachePath() {
return "cahced_video_" + System.currentTimeMillis() + ".mp4";
}
private void cleanCacheUri() {
filePathCallback = null;
mediaUri = null;
}
@Override
public int caseRequestCode() {
return FILE_CHOOSER_REQUEST_CODE;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (filePathCallback == null) {
return;
}
if (resultCode != RESULT_OK) {
filePathCallback.onReceiveValue(null);
cleanCacheUri();
return;
}
Uri result = data == null ? null : data.getData();
handleResultAboveLollipop(result);
cleanCacheUri();
}
private void handleResultAboveLollipop(Uri result) {
if (filePathCallback == null) {
return;
}
if (result != null) {
// handle image choose from file
String path = WebFileChooseHelper.getPath(activity, result);
if (TextUtils.isEmpty(path)) {
filePathCallback.onReceiveValue(null);
return;
}
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Context appContext = TJAppScopeComponents.getAppContext();
uri = FileProvider.getUriForFile(appContext, appContext.getPackageName() + ".provider", new File(path));
} else {
uri = Uri.fromFile(new File(path));
}
filePathCallback.onReceiveValue(new Uri[]{uri});
} else {
// handle capture
filePathCallback.onReceiveValue(new Uri[]{mediaUri});
}
}
}
和ActivityResultCase委托:
public interface ActivityResultCaseDelegate {
int caseRequestCode();
void onActivityResult(int requestCode, int resultCode, Intent data);
}
您可以使用此添加onActivityResult案例。
在html中:
<input type="file" accept="image/*" capture="camera">
在PlayStation®Store上寻找与照片相关的信息。 可在PlayStation®Store寻找游戏的截图等,与该照片相关的信息。 使用阅览器显示想寻找信息的照片,并轻触(选项)>[在PlayStation®Store中寻找]。 依照片不同,可能无法寻找信息。在此情况下,不会显示此选项。 修剪照片 可删除照片上下左右不需要的部分,仅保留需要的部分。 使用阅览器显示要修剪的照片,并轻触(选项
可拍摄及观赏照片的应用程序。 照片的LiveArea™ 拍摄照片 观赏照片 活用照片 可在照片程序显示的文件类型
喂, 我使用一个webview,上面有一个按钮,可以浏览应用程序的照片库。 但是,当在webview中单击该按钮时,什么也不会发生。 url的格式为: 我已添加以下权限: 我有一个片段,它将在启用javascript的onCreateView方法(仅限代码段)中加载webview。
Since 8.1 photo 拍照/选择照片 不推荐使用,建议使用新的chooseImage接口 使用方法 AlipayJSBridge.call('photo', { dataType: 'dataURL', imageFormat: 'jpg', quality: 75, maxWidth: 500, maxHeight: 500, allowEdit: true,
可依月份排列,或拍摄/输入的图像(相机图像)等分类选择显示照片。 A ) (摄影模式) 轻触图标可启动相机,切换为摄影模式。 若连接PS3™或电脑,列表上会追加[PS3™]或[电脑]分类,亦可显示各分类中保存的内容。* * PS Vita可播放的文件类型有限。 若轻触内容,会以全屏显示。 操作键等在数秒钟后会自动隐藏,若想再次显示请轻触屏幕。 A ) (删除)/(幻灯片播放)/(上一张)/(下一张
可使用前端相机或背面相机拍摄照片。 A ) (显示模式) 轻触图标可切换为显示模式。 B ) (位置数据)/(切换相机)/(切换图像大小) 启用位置数据的使用设定即可显示(位置数据)。轻触图标可使用Wi-Fi、GPS*、手机基地台*的信息取得位置数据。取得后会显示(已取得位置数据),拍摄照片时会同时记录位置数据。 * 仅限3G/Wi-Fi机种 C ) (快门) 轻触图标可拍摄照片。 D ) 已拍摄