uni-app直接调用安卓自定义方法

发布于 1周前 作者 bupafengyu 来自 Uni-App

uni-app直接调用安卓自定义方法 在研究离线打包和三方插件之后的一天,发现uniapp可以直接调用安卓里写的方法,之前完全是自己想复杂了,主要还是h5+ 的开发没那么熟悉。

此处基于uniapp在Android Studio离线打包成功后部分。

  1. 因为之前离线打包,安卓下的项目java里面的全部都删除了,现在新增一个自定义的包在下面新增一个java类。为了测试功能,写了个简单的加法。
package com.hji.test;

public class AddCount {
    public int add(int a, int b) {
        return a + b;
    }
}

在uniapp vue下,新增一个按钮,和方法

add2(){
    var AddCount = plus.android.importClass('com.hji.test.AddCount');
    var addCount = new AddCount();
    this.result1 = addCount.add(1,2);
},

本地打包后,替换掉www下文件。运行就可以

简单哭了,我想的也太复杂了T T

为了测试调用安卓上页面,也写了个简单的拍照;

在自定义的包下新建一个java类

package com.hji.test;

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ImageView;

import com.example.mytest.R;

public class TakePhotoActivity extends AppCompatActivity {
    private ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_take_photo);

        imageView = findViewById(R.id.imageView);
    }

    static final int REQUEST_IMAGE_CAPTURE = 1;

    public void takePhoto(View view) {
        dispatchTakePictureIntent();
    }

    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            imageView.setImageBitmap(imageBitmap);
        }
    }
}

在res下layout新增一个拍照页面

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.hji.test.TakePhotoActivity">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="342dp"
        android:layout_height="360dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="17dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button2"
        tools:srcCompat="@tools:sample/avatars" />

    <Button
        android:id="@+id/button2"
        style="@style/Widget.AppCompat.Button.Small"
        android:layout_width="101dp"
        android:layout_height="48dp"
        android:layout_marginStart="63dp"
        android:layout_marginLeft="63dp"
        android:layout_marginTop="16dp"
        android:onClick="takePhoto"
        android:text="拍 照"
        android:textColor="@android:color/holo_green_dark"
        android:textSize="14sp"
        android:typeface="normal"
        android:visibility="visible"
        app:layout_constraintStart_toStartOf="parent"
      />
</android.support.constraint.ConstraintLayout>

在uniapp下使用

takePhoto() {
    var main = plus.android.runtimeMainActivity();
    var Intent = plus.android.importClass('android.content.Intent');
    var MyActivity = plus.android.importClass('com.hji.test.TakePhotoActivity');
    var intent = new Intent(main, MyActivity.class);
    main.startActivity(intent);
},

1 回复

uni-app 中调用安卓自定义方法,通常需要通过原生插件机制来实现。以下是一个简单的示例,展示了如何在 uni-app 中调用安卓自定义方法。

1. 创建安卓原生插件

首先,你需要在安卓项目中创建一个自定义的原生插件。假设我们创建一个名为 MyPlugin 的插件,并在其中定义一个 sayHello 方法。

创建插件类

android/app/src/main/java/com/yourpackage/plugins 目录下创建一个名为 MyPlugin.java 的文件:

package com.yourpackage.plugins;

import android.webkit.JavascriptInterface;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;

public class MyPlugin extends UniModule {

    @JavascriptInterface
    public void sayHello(String param, UniJSCallback callback) {
        String result = "Hello, " + param + "!";
        callback.invoke(result);
    }
}

注册插件

android/app/src/main/java/com/yourpackage 目录下的 App.javaMainApplication.java 文件中注册这个插件:

import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.common.UniModule;
import com.yourpackage.plugins.MyPlugin;

public class App extends UniSDKApplication {
    @Override
    public void onCreate() {
        super.onCreate();
        // 注册插件
        mUniSDKInstance.registerModule("MyPlugin", MyPlugin.class);
    }
}

2. 在 uni-app 中调用安卓插件

在你的 uni-app 项目中,你可以通过 plus.bridge.exec 方法来调用这个自定义的安卓插件方法。

// 检查平台
if (uni.getSystemInfoSync().platform === 'android') {
    plus.bridge.exec('MyPlugin', 'sayHello', ['uni-app'], function(result) {
        console.log('Result from Android:', result); // 输出: Hello, uni-app!
    });
} else {
    console.log('This feature is only available on Android.');
}

注意事项

  1. 权限管理:确保你的安卓应用具有必要的权限。
  2. 版本兼容性:测试不同安卓版本下的兼容性。
  3. 调试:使用 Android Studio 进行调试,确保插件方法被正确调用和返回结果。

通过上述步骤,你可以在 uni-app 中成功调用安卓自定义方法。这只是一个简单的示例,实际应用中可能需要处理更多的细节和边缘情况。

回到顶部