Код буфера обмена Android, который работает на всех уровнях API - PullRequest
5 голосов
/ 27 января 2012

Код буфера обмена, который работает для уровней API <11, вылетает на устройствах с уровнями API> = 11.

Код буфера обмена, работающий на уровне API> = 11, вылетает на устройствах с уровнями API <11. </p>

Я не могу скомпилировать код для обеих версий, поскольку они противоречат требованиям к импорту.

Нужно: import android.text.ClipboardManager;

в то время как другим нужно: import android.content.ClipboardManager;

Конечно, есть способ написать некоторый код, который будет работать на обеих сторонах уровня API 11. Я просто не могу понять это.

*** Отредактировано (поскольку я не могу ответить на свой вопрос) ** *****

Я нашел проблему. Сообщение об исключении говорит: «Не удается создать обработчик внутри потока, который не вызвал Looper.prepare ()».

Очевидно, мне нужно перепрыгнуть через несколько обручей, так как я выполняю этот код из асинхронной задачи.

Ответы [ 4 ]

21 голосов
/ 10 июня 2012

Я недавно столкнулся с подобной проблемой.Вот как я справился с этим.

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();

Я не совсем уверен, нужен ли первый блок.Но я бы предпочел не рисковать:)

6 голосов
/ 18 октября 2012

Чтобы избежать исключения

[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);
  }
}
1 голос
/ 06 февраля 2015

Напишите себе свой собственный класс обмена буфера обмена, например:

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());
        }
    }
}
1 голос
/ 27 января 2012

Код буфера обмена, который работает для уровней API <11, вылетает на устройствах с уровнями API> = 11.

Этот пример проекта прекрасно работает на уровнях API до и после 11. Я только что протестировал его на Android 2.3 (Nexus One) и Android 4.0 (Nexus S).

Код буфера обмена, работающий на уровне API> = 11, вылетает на устройствах с уровнями API <11. </p>

Это не удивительно. Если вы имеете в виду классы или методы, которые не существуют в более старых версиях Android, вы получите VerifyError или аналогичные сбои.

Я не могу скомпилировать код для обеих версий, поскольку они противоречат требованиям к импорту.

Не совсем.

Нужно: import android.text.ClipboardManager;

Это работает на всех уровнях API.

, в то время как другие нужны: import android.content.ClipboardManager;

Это было добавлено к API уровня 11. Если ваше приложение будет работать только на API уровня 11 или выше, используйте этот класс (все сигнатуры методов IIRC).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...