2012-01-27 16 views
5

Il codice di appunti che funziona per i livelli di API < 11 arresti su dispositivi con livelli di API> = 11.codice appunti Android che funziona su tutti i livelli di API

Il codice di appunti che lavorano per livello di API> = 11 arresti su dispositivi con livelli API < 11.

Non riesco a compilare il codice per entrambe le versioni perché hanno requisiti di importazione in conflitto.

Una delle esigenze: importazione android.text.ClipboardManager;

mentre l'altra necessità: importazione android.content.ClipboardManager;

Sicuramente c'è un modo per scrivere un codice che funzioni su entrambi i lati del livello API 11. Non riesco proprio a capirlo.

** * cura (Dal momento che non posso rispondere alla mia domanda) ** * *** *

ho trovato il problema. Il messaggio di eccezione dice "Impossibile creare il gestore all'interno di un thread che non ha chiamato Looper.prepare()".

A quanto pare, devo passare da qualche altro anello da quando eseguo questo codice da un task Async.

+0

Si dovrebbe essere in esecuzione questo codice solo dall'applicazione principale thread, come 'onPostExecute()' del tuo 'AsyncTask'. – CommonsWare

risposta

1

Il codice di appunti che funziona per i livelli di API < 11 arresti su dispositivi con i livelli di API> = 11.

This sample project funziona abbastanza bene su livelli API prima e dopo l'11 ho appena riprovato su Android 2.3 (Nexus One) e Android 4.0 (Nexus S).

Il codice appunti che funziona per API di livello> = 11 si blocca su dispositivi con livelli API < 11.

che non è sorprendente. Se ti riferisci a classi o metodi che non esistono nelle versioni precedenti di Android, otterrai un errore VerifyError o simili.

Non riesco a compilare il codice per entrambe le versioni perché hanno requisiti di importazione in conflitto.

Non proprio.

Una necessità: import android.text.ClipboardManager;

Che funziona su tutti i livelli API.

mentre l'altro ha bisogno di: importare android.content.ClipboardManager;

Questo è stato aggiunto all'API Livello 11. Se l'app verrà eseguita solo su API Livello 11 o superiore, utilizzare questa classe (le firme del metodo sono tutte le stesse IIRC).

+0

Ho eseguito il codice quasi identico sull'emulatore 4.0. Quando eseguo il "ClipboardManager cm = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE);" ottengo: 01-26 16: 27: 10,886: W/AsyncTask (725): java.lang.InterruptedException – Xarph

+0

Ok yah, il codice funziona, ma ancora mostra avvertimento Metodo obsoleto. Sarà un problema in futuro ??? Voglio dire, il metodo verrà cancellato per sempre in futuro ??? –

+0

http://stackoverflow.com/a/11012443/166949 – steveha

21

Recentemente ho affrontato un problema simile. Ecco come l'ho gestito.

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

Non sono del tutto sicuro se il primo blocco se è necessario. Ma preferisco non correre il rischio :)

+0

Che cos'è l'etichetta qui? –

+1

@SrujanBarai - 'label' è un'etichetta visibile dall'utente per i dati della clip. Questo campo 'label' viene utilizzato principalmente dalle app di gestione degli appunti come titolo dei dati dei clip che vengono copiati. Per ulteriori informazioni, consultare: http://developer.android.com/reference/android/content/ClipData.html#newPlainText(java.lang.CharSequence, java.lang.CharSequence) –

6

Per evitare l'eccezione

[FATAL EXCEPTION: GLThread 6132 java.lang.RuntimeException: 
Can't create handler inside thread that has not called Looper.prepare() ], 

-> basta creare il ClipboardManager una volta in fase di avvio, ad esempio nel metodo onCreate() e utilizzarlo in qualsiasi momento in un separato funzione.

testati a lavorare su 2.3.3 e 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

Scrivi voi stessi la propria classe compat Appunti, ad esempio:

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()); 
     } 
    } 
} 
Problemi correlati