Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
适用于所有API级别的Android剪贴板代码_Android_Api_Clipboard - Fatal编程技术网

适用于所有API级别的Android剪贴板代码

适用于所有API级别的Android剪贴板代码,android,api,clipboard,Android,Api,Clipboard,适用于API级别=11的设备上崩溃 API级别>=11的剪贴板代码在API级别=11的剪贴板代码在API级别

适用于API级别<11的剪贴板代码在API级别>=11的设备上崩溃

API级别>=11的剪贴板代码在API级别<11的设备上崩溃

我不能为这两个版本编译代码,因为它们有冲突的导入要求

我们需要: 导入android.text.ClipboardManager

而其他需要: 导入android.content.ClipboardManager

当然,有一种方法可以编写一些在API级别11的两侧都能工作的代码。我就是搞不懂

***编辑,因为我不能回答自己的问题*******

我发现了问题。异常消息说,无法在未调用Looper.prepare的线程内创建处理程序

显然,由于我是从一个异步任务执行这段代码,所以我不得不跳过更多的障碍

适用于API级别<11的剪贴板代码在API级别>=11的设备上崩溃

在11之前和之后的API级别上都可以很好地工作。我刚刚在安卓2.3NexusOne和安卓4.0NexusS上重新测试了它

API级别>=11的剪贴板代码在API级别<11的设备上崩溃

这并不奇怪。如果您引用的类或方法在旧版本的Android中不存在,则会出现VerifyError或类似崩溃

我不能为这两个版本编译代码,因为它们有冲突的导入要求

不是真的

一个需要:导入android.text.ClipboardManager

这适用于所有API级别

而其他需要:导入android.content.ClipboardManager


这被添加到API级别11中。如果您的应用程序仅在API 11级或更高级别上运行,请使用此类方法签名都是相同的IIRC。

我最近遇到了类似的问题。 我是这样处理的

int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB){
     android.content.ClipboardManager clipboard =  (android.content.ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
        ClipData clip = ClipData.newPlainText("label", "Text to Copy");
        clipboard.setPrimaryClip(clip); 
} else{
    android.text.ClipboardManager clipboard = (android.text.ClipboardManager)getSystemService(CLIPBOARD_SERVICE); 
    clipboard.setText("Text to Copy");
}
Toast.makeText(getApplicationContext(), "Text copied to clipboard", Toast.LENGTH_SHORT).show();

我不完全确定是否需要第一个if块。但我不想冒险:

来避免这个例外

[FATAL EXCEPTION: GLThread 6132  java.lang.RuntimeException: 
Can't create handler inside thread that has not called Looper.prepare() ], 
->只需在启动时创建一次ClipboardManager,例如在onCreate方法中,并随时在单独的函数中使用它

在2.3.3和4.0.3中测试工作:

import android.text.ClipboardManager;
import android.content.ClipData;
..
public class myActivity extends Activity
{
  private static ClipboardManager m_ClipboardManager;

  @Override
  protected void onCreate(..)
  {
    ...
   m_ClipboardManager = (ClipboardManager)     m_sInstance.getSystemService(Context.CLIPBOARD_SERVICE); 
  }

  public static void myCopyToClipBoard(String sTxt)
  {
    m_ClipboardManager.setText(sTxt);
  }
}

编写自己的剪贴板compat类,例如:

import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.Context;
import android.net.Uri;


public class ClipboardCompat {
    private android.content.ClipboardManager currentCM=null;
    private android.text.ClipboardManager legacyCM=null;

    public ClipboardCompat() {
        if(android.os.Build.VERSION.SDK_INT >= 11 && currentCM == null) {
            currentCM = (android.content.ClipboardManager)
                    [getsomecontext].getSystemService(Context.CLIPBOARD_SERVICE);
        }
        else if(legacyCM == null)
        {
            legacyCM = (android.content.ClipboardManager)
                    [getsomecontext].getSystemService(Context.CLIPBOARD_SERVICE);
        }
    }

    @SuppressLint("NewApi")
    public String getText() {
        if(currentCM!=null) {
            try{
                return currentCM.getPrimaryClip().getItemAt(0).getText().toString();
            } catch (NullPointerException e) {
                return null;
            }
        }
        else
        {
            try{
                return legacyCM.getText().toString();
            } catch (NullPointerException e) {
                return null;
            }
        }
    }

    @SuppressLint("NewApi")
    public Uri getUri() {
        if(currentCM!=null) {
            try{
                return currentCM.getPrimaryClip().getItemAt(0).getUri();
            } catch (NullPointerException e) {
                return null;
            }
        }
        else
        {
            return null;
        }
    }

    @SuppressLint("NewApi")
    public void set(String name, String s) {
        if(currentCM!=null) {
            ClipData clip = ClipData.newPlainText(name, s);
            currentCM.setPrimaryClip(clip);
        }
        else
        {
            legacyCM.setText(s);
        }
    }

    @SuppressLint("NewApi")
    public void set(String name, Uri u) {
        if(currentCM!=null) {
            ClipData clip = ClipData.newRawUri(name, u);
            currentCM.setPrimaryClip(clip);
        }
        else
        {
            legacyCM.setText(u.toString());
        }
    }
}

我在4.0模拟器上运行了几乎相同的代码。当我执行ClipboardManager cm=ClipboardManagerTargetSystemServiceClipboard\u服务时;我得到:01-26 16:27:10.886:W/AsyncTask725:java.lang.InterruptedExceptionOk耶,您的代码正在工作,但仍然显示不推荐的方法警告。将来会有问题吗???我的意思是这个方法将来会被永远删除吗???您应该只从主应用程序线程运行此代码,例如AsyncTask的onPostExecute。这里的标签是什么?@SrujanBarai-label是剪辑数据的用户可见标签。剪贴板管理器应用程序主要使用此标签字段作为复制的剪辑数据的标题。有关更多信息,请参阅:,java.lang.CharSequence