android 上传图片代码,Android 开发之 Webview 上传图片代码(Kotlin版)

可以直接滑动到页面底部复制可以正常编译运行的 Kotlin 代码。

我们一个新的 Android 项目是用 Kotlin 来开发,因使用到了 Webview,不可避免地会遇到 Webview 中上传图片的问题,如果不做处理的话,在 web 中点击是没有任何反应的,需要写一堆方法。

我直接拿这篇文章「Android WebView那些坑之上传文件」的 Java 代码,然后用 Android Studio的自动转换,转换为 Kotlin 代码,但有两处报错。

首先把 Java 代码贴出来:

public class MainActivity extends AppCompatActivity {

private ValueCallback uploadMessage;

private ValueCallback uploadMessageAboveL;

private final static int FILE_CHOOSER_RESULT_CODE = 10000;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

WebView webview = (WebView) findViewById(R.id.web_view);

assert webview != null;

WebSettings settings = webview.getSettings();

settings.setUseWideViewPort(true);

settings.setLoadWithOverviewMode(true);

settings.setJavaScriptEnabled(true);

webview.setWebChromeClient(new WebChromeClient() {

// For Android < 3.0

public void openFileChooser(ValueCallback valueCallback) {

uploadMessage = valueCallback;

openImageChooserActivity();

}

// For Android >= 3.0

public void openFileChooser(ValueCallback valueCallback, String acceptType) {

uploadMessage = valueCallback;

openImageChooserActivity();

}

//For Android >= 4.1

public void openFileChooser(ValueCallback valueCallback, String acceptType, String capture) {

uploadMessage = valueCallback;

openImageChooserActivity();

}

// For Android >= 5.0

@Override

public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {

uploadMessageAboveL = filePathCallback;

openImageChooserActivity();

return true;

}

});

String targetUrl = "file:///android_asset/up.html";

webview.loadUrl(targetUrl);

}

private void openImageChooserActivity() {

Intent i = new Intent(Intent.ACTION_GET_CONTENT);

i.addCategory(Intent.CATEGORY_OPENABLE);

i.setType("image/*");

startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == FILE_CHOOSER_RESULT_CODE) {

if (null == uploadMessage && null == uploadMessageAboveL) return;

Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();

if (uploadMessageAboveL != null) {

onActivityResultAboveL(requestCode, resultCode, data);

} else if (uploadMessage != null) {

uploadMessage.onReceiveValue(result);

uploadMessage = null;

}

}

}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {

if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null)

return;

Uri[] results = null;

if (resultCode == Activity.RESULT_OK) {

if (intent != null) {

String dataString = intent.getDataString();

ClipData clipData = intent.getClipData();

if (clipData != null) {

results = new Uri[clipData.getItemCount()];

for (int i = 0; i < clipData.getItemCount(); i++) {

ClipData.Item item = clipData.getItemAt(i);

results[i] = item.getUri();

}

}

if (dataString != null)

results = new Uri[]{Uri.parse(dataString)};

}

}

uploadMessageAboveL.onReceiveValue(results);

uploadMessageAboveL = null;

}

}

转换后的 Kotlin 代码:

class MainActivity : AppCompatActivity() {

private var uploadMessage: ValueCallback? = null

private var uploadMessageAboveL: ValueCallback>? = null

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

val webview = findViewById(R.id.web_view) as WebView

val settings = webview.settings

settings.useWideViewPort = true

settings.loadWithOverviewMode = true

settings.javaScriptEnabled = true

webview.webChromeClient = object : WebChromeClient() {

// For Android < 3.0

fun openFileChooser(valueCallback: ValueCallback) {

uploadMessage = valueCallback

openImageChooserActivity()

}

// For Android >= 3.0

fun openFileChooser(valueCallback: ValueCallback, acceptType: String) {

uploadMessage = valueCallback

openImageChooserActivity()

}

//For Android >= 4.1

fun openFileChooser(

valueCallback: ValueCallback,

acceptType: String,

capture: String

) {

uploadMessage = valueCallback

openImageChooserActivity()

}

// For Android >= 5.0

override fun onShowFileChooser(

webView: WebView,

filePathCallback: ValueCallback>,

fileChooserParams: WebChromeClient.FileChooserParams

): Boolean {

uploadMessageAboveL = filePathCallback

openImageChooserActivity()

return true

}

}

val targetUrl = "file:///android_asset/up.html"

webview.loadUrl(targetUrl)

}

private fun openImageChooserActivity() {

val i = Intent(Intent.ACTION_GET_CONTENT)

i.addCategory(Intent.CATEGORY_OPENABLE)

i.type = "image/*"

startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE)

}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

super.onActivityResult(requestCode, resultCode, data)

if (requestCode == FILE_CHOOSER_RESULT_CODE) {

if (null == uploadMessage && null == uploadMessageAboveL) return

val result = if (data == null || resultCode != Activity.RESULT_OK) null else data.data

if (uploadMessageAboveL != null) {

onActivityResultAboveL(requestCode, resultCode, data)

} else if (uploadMessage != null) {

uploadMessage!!.onReceiveValue(result)

uploadMessage = null

}

}

}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

private fun onActivityResultAboveL(requestCode: Int, resultCode: Int, intent: Intent?) {

if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null)

return

var results: Array? = null

if (resultCode == Activity.RESULT_OK) {

if (intent != null) {

val dataString = intent.dataString

val clipData = intent.clipData

if (clipData != null) {

results = arrayOfNulls(clipData.itemCount)

for (i in 0 until clipData.itemCount) {

val item = clipData.getItemAt(i)

results[i] = item.uri

}

}

if (dataString != null)

results = arrayOf(Uri.parse(dataString))

}

}

uploadMessageAboveL!!.onReceiveValue(results)

uploadMessageAboveL = null

}

companion object {

private val FILE_CHOOSER_RESULT_CODE = 10000

}

}

两处报错如下。

第 1 处:

d4a218e4c301

image.png

修改后:

// For Android >= 3.0

fun openFileChooser(valueCallback: ValueCallback, acceptType: String) {

uploadMessage = valueCallback

openImageChooserActivity()

}

第 2 处:

d4a218e4c301

image.png

修改后:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

private fun onActivityResultAboveL(requestCode: Int, resultCode: Int, intent: Intent?) {

if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null)

return

var results: Array? = null

if (resultCode == Activity.RESULT_OK) {

if (intent != null) {

val dataString = intent.dataString

val clipData = intent.clipData

if (clipData != null) {

results = Array(clipData.itemCount){

i -> clipData.getItemAt(i).uri

}

}

if (dataString != null)

results = arrayOf(Uri.parse(dataString))

}

}

uploadMessageAboveL!!.onReceiveValue(results)

uploadMessageAboveL = null

}

修改后就可以正常编译运行了。

最后把完整的 Kotlin 代码贴上来:

class MainActivity : AppCompatActivity() {

private var uploadMessage: ValueCallback? = null

private var uploadMessageAboveL: ValueCallback>? = null

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

val webview = findViewById(R.id.web_view) as WebView

val settings = webview.settings

settings.useWideViewPort = true

settings.loadWithOverviewMode = true

settings.javaScriptEnabled = true

webview.webChromeClient = object : WebChromeClient() {

// For Android < 3.0

fun openFileChooser(valueCallback: ValueCallback) {

uploadMessage = valueCallback

openImageChooserActivity()

}

// For Android >= 3.0

fun openFileChooser(valueCallback: ValueCallback, acceptType: String) {

uploadMessage = valueCallback

openImageChooserActivity()

}

//For Android >= 4.1

fun openFileChooser(

valueCallback: ValueCallback,

acceptType: String,

capture: String

) {

uploadMessage = valueCallback

openImageChooserActivity()

}

// For Android >= 5.0

override fun onShowFileChooser(

webView: WebView,

filePathCallback: ValueCallback>,

fileChooserParams: WebChromeClient.FileChooserParams

): Boolean {

uploadMessageAboveL = filePathCallback

openImageChooserActivity()

return true

}

}

val targetUrl = "file:///android_asset/up.html"

webview.loadUrl(targetUrl)

}

private fun openImageChooserActivity() {

val i = Intent(Intent.ACTION_GET_CONTENT)

i.addCategory(Intent.CATEGORY_OPENABLE)

i.type = "image/*"

startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE)

}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

super.onActivityResult(requestCode, resultCode, data)

if (requestCode == FILE_CHOOSER_RESULT_CODE) {

if (null == uploadMessage && null == uploadMessageAboveL) return

val result = if (data == null || resultCode != Activity.RESULT_OK) null else data.data

if (uploadMessageAboveL != null) {

onActivityResultAboveL(requestCode, resultCode, data)

} else if (uploadMessage != null) {

uploadMessage!!.onReceiveValue(result)

uploadMessage = null

}

}

}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

private fun onActivityResultAboveL(requestCode: Int, resultCode: Int, intent: Intent?) {

if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null)

return

var results: Array? = null

if (resultCode == Activity.RESULT_OK) {

if (intent != null) {

val dataString = intent.dataString

val clipData = intent.clipData

if (clipData != null) {

results = Array(clipData.itemCount){

i -> clipData.getItemAt(i).uri

}

}

if (dataString != null)

results = arrayOf(Uri.parse(dataString))

}

}

uploadMessageAboveL!!.onReceiveValue(results)

uploadMessageAboveL = null

}

companion object {

private val FILE_CHOOSER_RESULT_CODE = 10000

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值