2016-06-24 4 views
0

folgende Präferenz Header XML Gegeben:Fehlende Browser App verursacht Absturz für XML action.VIEW Intent

<?xml version="1.0" encoding="utf-8"?> 
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" > 

    <header 
     android:icon="@drawable/ic_public_white_36dp" 
     android:title="@string/menu_website" > 
     <intent 
      android:action="android.intent.action.VIEW" 
      android:data="http://www.example.com" /> 
    </header> 

</preference-headers> 

Was wäre der beste Weg, um diesen Fehler zu mildern:

Fatal Exception: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://www.example.com } 

Das Problem ist, dass Wenn auf dem Benutzergerät kein Browser installiert ist, stürzt der Benutzer mit diesem Fehler ab.

Darüber hinaus werden Amazon TV-Geräte auch abstürzen (da sie keinen Browser haben) mit ihrer eigenen Vielzahl von No-Browser-Ausnahme.

Normalerweise können Sie die Existenz eines Empfängers für diese Absicht prüfen oder einfach die Ausnahme abfangen. Mit XML ist es schwieriger. Ist die einzige Möglichkeit, dies zu verhindern, das Gerät in der PreferenceActivity zu überprüfen, um diese Kopfzeile für "schlechte" Geräte zu entfernen?

Antwort

0

Meine aktuelle Antwort auf diese Situation. Ich hoffe auf eine allgemeinere Lösung.

@Override 
public void onBuildHeaders(List<Header> target) { 
    loadHeadersFromResource(R.xml.preference_headers, target); 

    if(Utils.isAmazonTV() || !Utils.canHandleWebsite(this)) { 
     Iterator<Header> it = target.iterator(); 
     while(it.hasNext()) { 
      Header header = it.next(); 
      if(header.id == R.id.preference_website) { 
       it.remove(); 
      } 
     } 
    } 
} 
0

Aufbauend auf Ihrer eigenen Antwort entschied ich mich, etwas etwas raffinierteres zu tun.

@Override 
@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public void onBuildHeaders(List<Header> target) { 
    loadHeadersFromResource(R.xml.pref_headers, target); 
    Iterator<Header> it = target.iterator(); 
    while (it.hasNext()) { 
     Header header = it.next(); 
     if (header.id == R.id.id_of_header) { 

      //Website Intent 
      String url = "http://www.yoururl.com"; 
      Intent browserIntent = new Intent(Intent.ACTION_VIEW); 
      browserIntent.setData(Uri.parse(url)); 
      PackageManager packageManager = getPackageManager(); 
      if (browserIntent.resolveActivity(packageManager) != null) { 
       header.intent = browserIntent; 
      } else { 
       it.remove(); 
      } 
     } 
    } 

} 
+0

Es ist eine nette Idee - wenn Sie auf die aktuelle Apps-Marktseite verlinken möchten. Ich nehme an, Sie haben eine Einstellungszeile "Diese App bewerten" erstellt. Es hilft jedoch nicht, wenn Sie nur einen Link zu einer Website bereitstellen. Es wird zunächst versucht, eine Verbindung zum Markt für die aktuelle App herzustellen (was völlig gegen die Fragestellung ist)! Die Antwort ist jedoch solide und mehr Funktionen als meine. Wenn Sie den aktuellen Code zu einem zusätzlichen Beispiel machen und ein weiteres Beispiel darüber machen, das die Frage genauer darstellt, werde ich diese Antwort gerne annehmen. – Knossos

Verwandte Themen