This commit is contained in:
2026-09-24 16:25:22 +08:00
commit 7428184f01
1198 changed files with 314515 additions and 0 deletions
+6
View File
@@ -0,0 +1,6 @@
## 1.0.22025-08-03
* 兼容鸿蒙原生,使用时请自行申请权限使用。
## 1.0.12025-02-10
* 兼容微信
## 1.0.02025-01-08
* 剪切板操作
+83
View File
@@ -0,0 +1,83 @@
{
"id": "x-clipboard-s",
"displayName": "x-clipboard-s",
"version": "1.0.1",
"description": "x-clipboard-s",
"keywords": [
"x-clipboard-s"
],
"repository": "",
"engines": {
"HBuilderX": "^3.6.8"
},
"dcloudext": {
"type": "uts",
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "",
"data": "",
"permissions": ""
},
"npmurl": ""
},
"uni_modules": {
"dependencies": [],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "u",
"aliyun": "u",
"alipay": "u"
},
"client": {
"Vue": {
"vue2": "u",
"vue3": "u"
},
"App": {
"app-android": "u",
"app-ios": "u",
"app-harmony": "u"
},
"H5-mobile": {
"Safari": "u",
"Android Browser": "u",
"微信浏览器(Android)": "u",
"QQ浏览器(Android)": "u"
},
"H5-pc": {
"Chrome": "u",
"IE": "u",
"Edge": "u",
"Firefox": "u",
"Safari": "u"
},
"小程序": {
"微信": "u",
"阿里": "u",
"百度": "u",
"字节跳动": "u",
"QQ": "u",
"钉钉": "u",
"快手": "u",
"飞书": "u",
"京东": "u"
},
"快应用": {
"华为": "u",
"联盟": "u"
}
}
}
}
}
+90
View File
@@ -0,0 +1,90 @@
# x-clipboard-s
### 开发文档
[TMUI4.0文档](https://xui.tmui.design/)
[TMUI4.0组件库](https://ext.dcloud.net.cn/plugin?id=16369)
### 介绍
这是tmui4.0|XUI的原生插件附赠插件,提供了跨平台的剪贴板操作功能。支持在Android、iOS、Web和小程序平台上进行文本内容的复制和获取操作。
### 兼容性
| Harmony | IOS | Android | WEB | 小程序 |
| --- | --- | --- | --- | --- |
| 支持 | 支持 | 支持 | 支持 | 支持 |
```json
"requestPermissions": [
{
"name": "ohos.permission.READ_PASTEBOARD",
"reason": "$string:permission_read_pasteboard"
}
]
```
### 注意事项
- Web平台:新版浏览器会自动请求剪贴板权限
- Android平台:使用系统ClipboardManager服务实现
- iOS平台:使用UIPasteboard实现
- 小程序:使用平台原生API实现
### API接口
#### setClipboardData
`setClipboardData(data: string): Promise<boolean>`
设置剪贴板内容
**参数说明:**
- data:要设置的文本内容
**返回值:**
- `Promise<boolean>`:操作成功返回true,失败返回false
#### getClipboardData()
`getClipboardData(): Promise<string>`
获取剪贴板内容
**返回值:**
- `Promise<string>`:成功返回剪贴板文本内容,失败返回错误信息
### 使用示例
```ts
import { setClipboardData, getClipboardData } from "@/uni_modules/x-clipboard-s"
// 设置剪贴板内容
const setText = () => {
setClipboardData("要复制的文本").then(ok => {
if (ok) {
uni.showToast({ title: "复制成功", icon: "success" })
}
}).catch(err => {
uni.showToast({ title: "复制失败", icon: "error" })
})
}
// 获取剪贴板内容
const getText = () => {
getClipboardData().then((text: string) => {
uni.showToast({
title: text,
icon: "none"
})
}).catch(err => {
uni.showToast({
title: "获取剪贴板内容失败",
icon: "error"
})
})
}
```
### 常见问题
1. Web端获取剪贴板内容失败?
- 检查浏览器是否授予了剪贴板访问权限
- 确保在HTTPS环境下运行
2. Android/iOS端操作失败?
- 检查应用是否具有剪贴板权限
- 确保传入的是文本内容
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
package="io.dcloud.uni_modules.xClipboardS">
<uses-permission android:name="android.permission.READ_CLIPBOARD" />
<uses-permission android:name="android.permission.WRITE_CLIPBOARD" />
</manifest>
@@ -0,0 +1,3 @@
{
"minSdkVersion": "21"
}
@@ -0,0 +1,26 @@
import ClipData from "android.content.ClipData";
import ClipboardManager from "android.content.ClipboardManager";
import Context from "android.content.Context";
export const setClipboardData = (data : string):Promise<boolean> => {
let context = UTSAndroid.getAppContext()!
let clipboard : ClipboardManager | null = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager;
let clip : ClipData | null = ClipData.newPlainText("label", data);
if (clip != null && clipboard != null) {
clipboard.setPrimaryClip(clip);
return Promise.resolve(true)
} else {
return Promise.reject(false) as Promise<boolean>
}
}
export const getClipboardData = ():Promise<string> => {
let context = UTSAndroid.getAppContext()!
let clipboard : ClipboardManager | null = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager;
if (clipboard != null) {
if (clipboard.hasText()) {
return Promise.resolve(clipboard.getText().toString())
}
}
return Promise.reject('未知错误') as Promise<string>
}
@@ -0,0 +1,36 @@
import { BusinessError, pasteboard } from '@kit.BasicServicesKit';
export const setClipboardData = (data : string) : Promise<boolean> => {
let pasteData : pasteboard.PasteData = pasteboard.createData(pasteboard.MIMETYPE_TEXT_PLAIN, data);
let systemPasteboard : pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
return new Promise((res, rej) => {
systemPasteboard.setData(pasteData).then(() => {
console.info("成功")
res(true)
})
.catch((e) => {
const err = e as BusinessError
console.error(err.message)
rej(false)
})
})
}
export const getClipboardData = () : Promise<string> => {
let systemPasteboard : pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard();
// return new Promise((res, rej) => {
// systemPasteboard.getData((err, data) => {
// if (err) {
// console.error(err.message)
// return rej(err.message);
// }
// res(data.getPrimaryText())
// })
// })
return Promise.resolve('')
}
@@ -0,0 +1,11 @@
{
"module": {
"name": "uni_modules__x_clipboard_s",
"type":"har",
"deviceTypes": [
"default",
"tablet",
"2in1"
]
}
}
@@ -0,0 +1,8 @@
{
"string": [
{
"name": "permission_read_pasteboard",
"value": "应用需要读取剪粘板进行应用的个性化需要"
}
]
}
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
</dict>
</plist>
@@ -0,0 +1,3 @@
{
"deploymentTarget": "12"
}
@@ -0,0 +1,23 @@
import { UIPasteboard } from 'UIKit';
export const setClipboardData = (data : string):Promise<boolean> => {
try {
let borad : UIPasteboard = UIPasteboard.general
borad.string = data;
return Promise.resolve(true) as Promise<boolean>
} catch (errors) {
return Promise.reject(false) as Promise<boolean>
}
}
export const getClipboardData = ():Promise<string> => {
try {
let borad : UIPasteboard = UIPasteboard.general
if(borad.string == null){
return Promise.reject('未知错误') as Promise<string>
}
return Promise.resolve(borad.string!)
} catch (errors) {
return Promise.reject('未知错误') as Promise<string>
}
}
@@ -0,0 +1,27 @@
export const setClipboardData = (data : string):Promise<boolean> => {
return new Promise((resl,rejl)=>{
wx.setClipboardData({
data: data,
success(res) {
resl(true)
},
fail(res) {
rejl(false)
}
})
})
}
export const getClipboardData = ():Promise<string> => {
return new Promise((resl,rejl)=>{
wx.getClipboardData({
success(res) {
resl(res.data)
},
fail(res) {
rejl('未知错误')
}
})
})
}
@@ -0,0 +1,37 @@
export const setClipboardData = (data : string):Promise<boolean> => {
// 设置剪切板内容
return new Promise((resl,rejl)=>{
navigator.clipboard.writeText(data)
.then(() => {
resl(true)
})
.catch(err => {
rejl(false)
console.error('无法设置剪切板数据', err);
});
})
}
export const getClipboardData = ():Promise<string> => {
let inputdom = document.createElement("input") as HTMLInputElement;
inputdom.style.setProperty('opacity', '0')
inputdom.style.setProperty('position', 'absolute')
document.body.appendChild(inputdom)
inputdom.focus();
document.execCommand('paste');
return new Promise((resl,rejl)=>{
if (!document.execCommand('paste')) {
navigator.clipboard.readText()
.then(text => {
resl(text)
})
.catch(err => {
rejl('没有权限')
console.error('无法读取剪切板内容: ', err);
});
} else {
resl(inputdom.value)
}
inputdom.remove()
})
}