我想将存储在资源文件夹中的图像复制到剪贴板管理器,以便稍后粘贴到另一个应用程序上,如mail,whatapp或chat.我有研究员几个链接一些提到这可以做到一个文件的uri.
这是我得到的最好的,可以帮我指出一个有效的例子.
File imageFile = new File("file:///android_asset/coco_001.png");
ContentValues values = new ContentValues(2);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/png");
values.put(MediaStore.Images.Media.DATA, imageFile.getAbsolutePath());
ContentResolver theContent = getContentResolver();
Uri imageUri = theContent.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
ClipData theClip = ClipData.newUri(getContentResolver(),"Image", imageUri);
Run Code Online (Sandbox Code Playgroud) 在Android 4.1.1中,从中复制一些内容WebView(如段落,项目符号,跨度,链接),然后将其粘贴到EditText渲染器中,将HTML呈现得与原始HTML几乎一样(由于不支持许多标记,因此HTML并不完全相同,但足够接近)。
但是从Android 4.1.2开始,该文本不再粘贴为HTML,并且从ClipboardManager文本中读取时具有MIME_TYPE text\plain。有没有办法告诉剪贴板管理器从WebViewHTML中复制选择内容而不是文本?
如果用户将某些内容复制到剪贴板,我想得到通知。
我创建了一个服务并在 HomeActivity 中启动它,我还编写了一个计时器来检查我的服务是否正常工作。我检查过,我的服务正在运行 Log cat 显示了这一点。但是我的监听器方法不起作用,我在这里缺少什么?
剪贴板观察者服务:
public class ClipBoardWatcherService extends Service {
private final String tag = "FameThings";
private ClipboardManager.OnPrimaryClipChangedListener listener = new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
performClipBoardCheck();
}
};
public static void start(Context context) {
Intent i = new Intent(context, ClipBoardWatcherService.class);
context.startService(i);
}
@Override
public void onCreate() {
((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)).addPrimaryClipChangedListener(this.listener);
new Timer().scheduleAtFixedRate(new TimerTask(){
@Override
public void run(){
Log.i("tag", "A Kiss every 5 seconds");
}
},0,5000);
}
@Override
public int onStartCommand(Intent intent, int flags, int …Run Code Online (Sandbox Code Playgroud) 我收到了有关以下崩溃的报告
SecurityException: <<other_package>> from uid xxx not allowed to perform READ_CLIPBOARD
Run Code Online (Sandbox Code Playgroud)
当用户单击将文本复制到剪贴板的按钮时发生崩溃,如下所示。
val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("label", shareUrl)
clipboard.setPrimaryClip(clip)
Run Code Online (Sandbox Code Playgroud)
所以我的应用程序不会尝试从剪贴板读取任何内容。真的很令人困惑为什么会发生这个错误。
有谁知道这个崩溃是如何发生的以及我该如何解决这个问题?
附加信息
这种崩溃仅发生在 Android 9 和 Android 10 中,并且不容易发生(20 万月活跃用户中只有 6 个用户)
我在 Crashlytics 中只看到两个 <<other_package>>(一个是银行应用程序,另一个是音乐应用程序)。
ClipboardService.java我尝试阅读和的源代码AppOpsManager.java,发现崩溃可能来自noteOp于AppOpsManager.
这是崩溃的堆栈跟踪:
Fatal Exception: java.lang.SecurityException: <<other_package>> from uid xxx not allowed to perform READ_CLIPBOARD
at android.os.Parcel.createException(Parcel.java:2087)
at android.os.Parcel.readException(Parcel.java:2055)
at android.os.Parcel.readException(Parcel.java:2003)
at android.content.IClipboard$Stub$Proxy.setPrimaryClip(IClipboard.java:293)
at android.content.ClipboardManager.setPrimaryClip(ClipboardManager.java:106)
at my.package.MyClass.copyToClipboard(MyClass.java:63)
at android.view.View.performClick(View.java:7375)
at android.view.View.performClickInternal(View.java:7336)
at android.view.View.access$3900(View.java:822) …Run Code Online (Sandbox Code Playgroud) How can i disable Clipboard editor overlay, that is enabled by default in Android Emulator API 33?. It is very annoying while debugging apps.It always popup over my debugging apps, and i have to close this every time to do something in my debugging app.
我在{ text/plain {NULL} }使用时得到了,ClipData但如果我使用不推荐使用的方法,mClipboard.getText()它就可以正常工作。
if (mClipboard.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
ClipData clipData = mClipboard.getPrimaryClip();
ClipData.Item item = clipData.getItemAt(0);
Log.d(TAG, clipData.toString());
Log.d(TAG, mClipboard.getText());
}
Run Code Online (Sandbox Code Playgroud)
更新
三星 Galaxy Tab 3 中存在问题。
我想实现一个侦听器,如果有人从任何应用程序复制任何东西,它将监听.
我听说ClipboardManager.OnPrimaryClipChangedListener()哪个会听复制动作,但这不是接收器(据我所知).我得到了一个示例应用程序,这个应用程序背后的逻辑是,从系统启动启动服务并运行一个服务,它将监听复制操作,但我认为这将耗尽电池.我对吗?
那么我该如何实现一个可以监听Copy动作的Broadcast接收器呢.
我正在尝试清除android中的剪贴板数据如下,但它没有清除它.
ClipboardManager clipman = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
clipman.setPrimaryClip(null);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗 ?
当我将文本复制到剪贴板上时,onPrimaryClipChanged方法被调用两次.有什么想法吗?
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
final ClipboardManager cliboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
cliboardManager
.addPrimaryClipChangedListener(new OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
ClipData clipData = cliboardManager.getPrimaryClip();
System.out
.println("********** clip changed, clipData: "
+ clipData.getItemAt(0));
}
});
return true;
}
Run Code Online (Sandbox Code Playgroud)
测试用例:从BBC网站复制文本"继续"将产生以下输出:
继续
继续
但是,如果我调试程序,我可以看到clipData对象具有值:
ClipData {text/plain {T:continue}}
第一次调用onPrimaryClipChanged()并且
ClipData {text/plain"BBC - Homepage"{T:continue}}
下次onPrimaryClipChanged()被调用.
所以基本上第一次ClipDescription是{text/plain},第二次是ClipDescription {text/plain"BBC - Homepage"}(即包括网页的标题)
将数据复制到剪贴板管理器时出现问题
下面是代码
fun copyToClipboard(context: Context, text: CharSequence){
var clipboard: ClipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
var clip: ClipData = ClipData.newPlainText("label",text)
clipboard.primaryClip = clip!!
}
Run Code Online (Sandbox Code Playgroud)
正如@ianhanniballake 所建议的,我已经使用 setPrimaryClip() 和非空 ClipData
像下面
var clip: ClipData = ClipData.newPlainText("label",text)
clipboard.primaryClip = clip!!
Run Code Online (Sandbox Code Playgroud)
但不知道为什么,我仍然遇到同样的错误
Val cannot be reassigned
Run Code Online (Sandbox Code Playgroud) 当我想复制一行并在删除当前行的内容后将其粘贴到当前行中时,我最终粘贴了在删除剪贴板条目后删除的同一行 d
我试图将 onClickListener 添加到 RecyclerView 内的一个按钮,该按钮复制一个字符串,但它说 getSystemService(CLIPBOARD_SERVICE) 不可用。
public void onBindViewHolder(ViewHolder holder, int position) {
holder.title.setText(cardItems.get(position).title);
holder.content.setText(cardItems.get(position).content);
holder.copyButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
String text;
text = EditText.getText().toString();
myClip = ClipData.newPlainText("text", text);
myClipboard.setPrimaryClip(myClip);
Toast.makeText(getApplicationContext(), "Text Copied", Toast.LENGTH_SHORT).show();
}
});
}
Run Code Online (Sandbox Code Playgroud) java android android-context android-adapter clipboardmanager
我想添加一个按钮,该按钮将从卡片视图内的不可编辑文本视图中复制文本。我可以为此使用剪贴板管理器吗?
clipboardmanager ×13
android ×12
clipboard ×3
java ×2
android-12 ×1
copy-paste ×1
html ×1
image ×1
kotlin ×1
listener ×1
vi ×1
vim ×1
webview ×1