2017-12-21 2 views
0

implementieren Ich entdecken YouTube Direct Lite (Android/Java) auf GitHub (https://github.com/youtube/yt-direct-lite-android) als ein gutes Beispiel dafür, wie Benutzer zu ermöglichen, ein Video auf Ihre YouTube-Playlist zu laden. Ich habe es erfolgreich in Debug-und Release-APK-Modus auf Android 5.1.1 auf Nexus 4 und Android 4.2.2 arbeiten. auf Galaxy Tab 7. Ich bekomme jedoch eine Nachricht "Verbindung zu Play Services fehlgeschlagen" bei der Installation auf Android 7.0 auf LG4. "Leider hat I-Witness (umbenannt App) Uploader gestoppt" ist die Nachricht, bevor die App abstürzt, wenn ich mein Login-Konto auswähle.Wie YouTube Direct Lite in Android 7

Beim ersten Import des Codes von Git, Android Studio 3.01 zeigte einige veraltete Bibliotheken, die ich aktualisiert, und fand eine Heilung für einen httprequest/httpclient Fehler durch eine der genannten veralteten Bibliotheken verursacht. Die größten Probleme drehten sich um "com.google.android.gms: play-services-auth" und "com.google.android.gms: play-services-plus", die im ursprünglichen Beispiel 7,8 waren.

Android Studio empfohlen Update auf die aktuelle 11.8, aber wenn ich tat viele "rote Unterstreichungen des Todes" zeigte sich im Code und so war ich erfolgreich mit "com.google.android.gms: play-services-plus: 9.0 .0 'und com.google.android.gms: play-services-auth: 9.0.0.

Insbesondere bewirkt 11.8 einen Konflikt mit dem folgenden externen Bibliotheken zu Feuerbasis bezogen, die ich nicht verstehe, da Feuerbasis im Projekt nicht umgesetzt wird:

google.firebase:firebase-analytics-9.00 
google.firebase:firebase-analytics-impl-9.00 
google.firebase:firebase-common-9.00 
google.firebase:firebase-core-9.00 
google.firebase:firebase-iid-9.00 

Das Problem um die Authentifizierung zu drehen scheint, aber wo Debuggen für die spezifische Android-Version?

Hier ist meine App-Ebene build.gradle, wenn jemand mit YouTube direkt Lite vertraut sein könnte und eine Anregung, die Installation zu lösen auf Android machen 7:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 27 
    defaultConfig { 
     applicationId "com.abengnews.iwitness" 
     minSdkVersion 16 
     targetSdkVersion 27 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    lintOptions { 
     abortOnError false 
    } 
} 

dependencies { 
    implementation fileTree(include: ['*.jar'], dir: 'libs') 
    //compile fileTree(dir: 'libs', include: ['*.jar']) 
    implementation 'com.google.android.gms:play-services-plus:9.0.0' 
    implementation 'com.google.android.gms:play-services-auth:9.0.0' 
    //implementation 'com.google.android.gms:play-services-identity:9.0.0' 
    implementation 'com.android.support:appcompat-v7:27.0.2' 
    implementation 'com.android.support.constraint:constraint-layout:1.0.2' 
    testImplementation 'junit:junit:4.12' 
    androidTestImplementation 'com.android.support.test:runner:1.0.1' 
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 
    implementation 'com.android.support:support-v13:27.0.2' 
    implementation 'com.google.apis:google-api-services-youtube:v3-rev120-1.19.0' 
    implementation 'com.google.http-client:google-http-client-android:+' 
    implementation 'com.google.api-client:google-api-client:1.23.0' 
    implementation 'com.google.api-client:google-api-client-android:1.23.0' 
    implementation 'com.google.api-client:google-api-client-gson:+' 
    implementation 'com.google.code.gson:gson:2.2.4' 
    implementation 'com.mcxiaoke.volley:library:1.0.18' 
    implementation files('libs/YouTubeAndroidPlayerApi.jar') 
} 
configurations { 
    all { 
     exclude module: 'httpclient' 
     resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9' 
    } 
} 
apply plugin: 'com.google.gms.google-services' 

Vielen Dank für jede Hilfe.

P.S. Es stellt sich heraus, dass das Problem mit <uses-permission android:name="android.permission.GET_ACCOUNTS" /> in der AndroidManifest.xml, die in Android 6.1> geändert wurde, verwandt ist. Ich stolperte darüber, während ich mit den Einstellungen der App am Telefon herumhantierte. "Kontakte" war die einzige unter "Berechtigungen" aufgelistete Option, und als ich den Zugriff auf Kontakte aktivierte, funktionierte die App wie erwartet.

Jetzt muss ich herausfinden, wie die Erlaubnis zu bewirken programmatisch

+0

Aktualisiert ‚com.google.android.gms: Play-Dienste-Auth: 11.8.0 'und Gradle Sync hat die Firebase-Bibliotheken entsprechend aktualisiert, aber das Problem des Absturzes bleibt bestehen. (Ich weiß nicht, warum Gradle die Firebase-Bibliotheken zuvor nicht aktualisiert hat.) –

Antwort

0

Die Nachricht über den Fehler verbinden Dienste zu spielen und die anschließende Absturz sind auf die Tatsache, dass <uses-permission android:name="android.permission.GET_ACCOUNTS" /> im AndroidManifest.xml explizite Gewährung erfordert Erlaubnis des Nutzers seit Android 6.1.

Die folgenden Code-Bits in Android-Beispiel gefunden Laufzeitberechtigungen here haben die Probleme behoben (obwohl die App beim ersten Start nach der Installation abgestürzt ist, aber nicht später).

Wenn die Haupttätigkeit Seitenlasten:

 // Verify that all required contact permissions have been granted. 
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M); 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.GET_ACCOUNTS) 
       != PackageManager.PERMISSION_GRANTED) { 
      // Contacts permissions have not been granted. 
      Log.i(TAG, "Contact permissions has NOT been granted. Requesting permissions."); 
      requestContactsPermissions(); 
     } 

Und dann anfordert und das Festlegen von Berechtigungen:

// permissions 
/** 
* Id to identify a contacts permission request. 
*/ 
private static final int REQUEST_CONTACTS = 1; 

/** 
* Permissions required to read and write contacts. Used by the . 
*/ 
private static String[] PERMISSIONS_CONTACT = {Manifest.permission.GET_ACCOUNTS, 
}; 

/** 
* Requests the Contacts permissions. 
* If the permission has been denied previously, a SnackBar will prompt the user to grant the 
* permission, otherwise it is requested directly. 
*/ 
private void requestContactsPermissions() { 
    // BEGIN_INCLUDE(contacts_permission_request) 
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
      Manifest.permission.GET_ACCOUNTS) 
      ) { 

     // Provide an additional rationale to the user if the permission was not granted 
     // and the user would benefit from additional context for the use of the permission. 
     // For example, if the request has been denied previously. 
     Log.i(TAG, 
       "Displaying contacts permission rationale to provide additional context."); 

     // Display a SnackBar with an explanation and a button to trigger the request. 
     Snackbar.make(mLayout, R.string.permission_contacts_rationale, 
       Snackbar.LENGTH_INDEFINITE) 
       .setAction(R.string.ok, new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         ActivityCompat 
           .requestPermissions(MainActivity.this, PERMISSIONS_CONTACT, 
             REQUEST_CONTACTS); 
        } 
       }) 
       .show(); 
    } else { 
     // Contact permissions have not been granted yet. Request them directly. 
     ActivityCompat.requestPermissions(this, PERMISSIONS_CONTACT, REQUEST_CONTACTS); 
    } 
    // END_INCLUDE(contacts_permission_request) 
} 
/** 
* Callback received when a permissions request has been completed. 
*/ 
@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
             @NonNull int[] grantResults) { 

    if (requestCode == REQUEST_CONTACTS) { 
     Log.i(TAG, "Received response for contact permissions request."); 

     // We have requested multiple permissions for contacts, so all of them need to be 
     // checked. 
     if (PermissionUtil.verifyPermissions(grantResults)) { 
      // All required permissions have been granted, display contacts fragment. 
      Snackbar.make(mLayout, R.string.permision_available_contacts, 
        Snackbar.LENGTH_SHORT) 
        .show(); 
     } else { 
      Log.i(TAG, "Contacts permissions were NOT granted."); 
      Snackbar.make(mLayout, R.string.permissions_not_granted, 
        Snackbar.LENGTH_SHORT) 
        .show(); 
     } 

    } else { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

Ich bin sicher, es gibt einige redundanten Code, der gereinigt werden kann, da ich don Klicken Sie auf keine Schaltflächen, um Berechtigungen anzufordern.