android - Android webView 我可以打开图库并选择/上传文件,但需要像浏览器一样选择相机或图库
问题描述
在我试图使input type='file' accept='image/ '* 按钮在 webView 中像在浏览器中一样工作的详尽搜索中,我遇到了一些实际上对我有用的代码,但是(如您所见在下面的代码中)它会打开图库以直接选择文件而无需任何提示。我需要更改什么以提示用户使用相机或从图库中选择一个文件。我认为我复制的代码已经有很多需要的部分来允许相机功能,但我不认为向用户展示选项是我复制的代码的目标 - 所以他们可能已经删除了必要的部分。
我的 AndroidManifest.xml 有(我认为是)所需的条目:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.front" android:required="true" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
MainActivity.java
package {name redacted for SO};
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.CookieManager;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity {
public WebView webView;
// private float m_downX;
// private SwipeRefreshLayout mySwipeRefreshLayout;
private static final int STORAGE_PERMISSION_CODE = 123;
private final static int FILECHOOSER_RESULTCODE=1;
private ValueCallback<Uri[]> mUploadMessage;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webView);
webView.loadUrl("https://{url redacted for SO}");
initWebView();
}
//Requesting permission
private void requestStoragePermission() {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED){
openFileExplorer();
return;
}
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
//If the user has denied the permission previously your code will come to this block
//Here you can explain why you need this permission
//Explain here why you need this permission
}
//And finally ask for the permission
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
//Checking the request code of our request
if (requestCode == STORAGE_PERMISSION_CODE) {
//If permission is granted
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openFileExplorer();
//Displaying a toast
// Toast.makeText(this, "Permission granted now you can read the storage", Toast.LENGTH_LONG).show();
} else {
//Displaying another toast if permission is not granted
// Toast.makeText(this, "Oops you just denied the permission", Toast.LENGTH_LONG).show();
}
}
}
private void openFileExplorer(){
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
MainActivity.this.startActivityForResult( Intent.createChooser( i, "File Chooser" ), MainActivity.FILECHOOSER_RESULTCODE );
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == FILECHOOSER_RESULTCODE) {
if (null == mUploadMessage) return;
Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
if (result == null) {
mUploadMessage.onReceiveValue(null);
} else {
mUploadMessage.onReceiveValue(new Uri[]{result});
}
mUploadMessage = null;
}
}
public void requestCameraPermission() {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[] { android.Manifest.permission.CAMERA, android.Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
}
}
@Override
public void onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
return;
}
super.onBackPressed();
}
private void initWebView() {
webView.setWebChromeClient(new MyWebChromeClient(this));
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
invalidateOptionsMenu();
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
webView.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
invalidateOptionsMenu();
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
invalidateOptionsMenu();
}
});
webView.clearCache(true);
webView.clearHistory();
// webView.getSettings().setJavaScriptEnabled(true);
// webView.setWebViewClient(new WebViewClient());
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.setOverScrollMode(WebView.OVER_SCROLL_NEVER);
webView.setHorizontalScrollBarEnabled(false);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptThirdPartyCookies(webView,true);
}
private class MyWebChromeClient extends WebChromeClient {
Context context;
public MyWebChromeClient(Context context) {
super();
this.context = context;
}
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,
WebChromeClient.FileChooserParams fileChooserParams) {
mUploadMessage = filePathCallback;
requestStoragePermission();
requestCameraPermission();
return true;
}
}
}
解决方案
我向该主题发布了一个不同的更新问题,并找到了我正在寻找的内容。我不知道我是否应该将答案从那里复制到这里的这篇文章,或者只是发布一个链接,所以我只会发布一个链接。我希望它可以帮助别人。
推荐阅读
- ios - Xcode 10 GM - 提交到 App Store Connect 时二进制架构无效?
- swift - 非常基本的示例出错 - swift - 尝试显示其视图不在窗口层次结构中
- python-3.x - TensorFlow 函数 RAM 使用率不断上升
- css - PrimeNG 使用 inputStyleClass 自动完成
- razor - Umbraco 7.12:如果 X 匹配当前页面 ID,或任何当前页面的后代 - 有可能吗?
- android - 如何对 ArrayList 进行排序
- reactjs - 使用 TypeScript 加载 SVG 文件
- python - 使用pycharm在python中输入提示
- vim - 如何从 Vim 的 match() 函数中删除颜色高亮
- excel - 无法在 mac 中使用 vba 更改按钮颜色