2012-12-14 7 views
5

Vorrei integrare un pulsante "Donazione tramite Bitcoin" in PreferenceScreen di un'applicazione Android.Gestione di schemi URI sconosciuti in Android (esempio Bitcoin)

Ci sono alcuni client Bitcoin per Android che girano, e Bitcoin wiki definisce uno URI scheme che dovrebbe essere usato per i pagamenti BTC.

Ho provato il seguente codice

findPreference(getString(R.string.preference_donateBitcoin)).setOnPreferenceClickListener(new OnPreferenceClickListener() { 

      @Override 
      public boolean onPreferenceClick(Preference preference) { 
       String url = getString(R.string.pref_donateBitcoin_uri); 
       Intent i = new Intent(Intent.ACTION_VIEW); 
       i.setData(Uri.parse(url)); 
       startActivity(i); 
       return false; 
      } 
     }); 

withou un BTC installato sul telefono. Ho provato a lanciare l'intento con il seguente URI: bitcoin:19iSEgNkJnEUtNDuuTkkZrU44PVKYMVfhz?amount=1 in attesa che Android indichi che non è installato alcun gestore.

Invece ho ottenuto un ActivityNotFoundException

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=bitcoin:19iSEgNkJnEUtNDuuTkkZrU44PVKYMVfhz?amount=1 } 

La mia domanda riguarda gestisce correttamente (leggi "buone pratiche") URI regimi sconosciuti al dispositivo.

  • Come si controlla che un determinato schema URI possa essere gestito almeno da un'applicazione? (se di più, suppongo una schermata di scelta)
  • Con riferimento a Bitcoin ma senza riferimento a qualsiasi cliente specifico, cosa dovrebbe essere l'intento migliore quando si paga tramite Bitcoin? Come gestire il caso quando nessun client BTC è installato?

[Modifica]: la domanda è errata perché ho incasinato i backup del mio telefono e presumevo che l'app Bitcoin Wallet fosse installata quando non lo era.

risposta

4

Come si verifica che un determinato schema URI possa essere gestito almeno da un'applicazione? (Se più, suppongo uno schermo scelta)

O:

  • basta prendere il ActivityNotFoundException, o

  • uso PackageManager e resolveActivity() o queryIntentActivities() per vedere se c'è qualcosa che corrisponde alla tua Intent

Con riferimento a Bitcoin ma senza riferimento a quel cliente specifico, quale dovrebbe essere l'intento migliore quando si paga tramite Bitcoin?

Si dovrebbe chiedere di Bitcoin gli autori applicazioni che domanda, o incoraggiarli ad adottare uno standard Uri, se non l'hanno già fatto.

In base al file manifest dell'applicazione, l'Intent sembra funzionare correttamente. Almeno, utilizzando AppXplore, vedo un'attività per ACTION_VIEW per i valori Uri con uno schema di bitcoin. Quindi, potresti voler contattare lo sviluppatore di questa app e vedere se riesci a determinare esattamente dove stai andando male con la tua integrazione.

Come gestire il caso quando nessun client BTC è installato?

Offerta per prendere l'utente al Play Store di installare alcuni client Bitcoin che ti piace, tramite un market:Uri.

+1

Grazie! Per favore lasciaci ignorare la parte "contatta lo sviluppatore" perché mi sono confuso :) e presumo che il portafoglio BTC sia stato installato sul telefono (invece funziona solo sul mio tablet). Dopo averlo installato dal Market, l'ho aperto con successo con quello schema URI. Il resto della risposta risponde alla mia domanda e sarà la soluzione al mio problema –

+1

@djechelon: 'ActivityNotFoundException' è uno standard' RuntimeException'. Disporre la chiamata 'startActivity()' in un blocco 'try' /' catch' adatto dovrebbe funzionare. http://stackoverflow.com/questions/8399065/how-to-handle-the-activitynotfoundexception – CommonsWare