1
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
## 1.0.2(2025-08-03)
|
||||
* 兼容鸿蒙原生,使用时请自行申请权限使用。
|
||||
## 1.0.1(2025-02-10)
|
||||
* 兼容微信
|
||||
## 1.0.0(2025-01-08)
|
||||
* 剪切板操作
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
})
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user