android - 如何在Android 7中实现YouTube Direct Lite

标签 android youtube

我在GitHub(https://github.com/youtube/yt-direct-lite-android)上发现了YouTube Direct Lite(Android / Java),这是如何允许用户将视频上传到您的YouTube播放列表的一个很好的例子。我已使其在Nexus 4和Android 4.2.2上的Android 5.1.1的调试和发布apk模式下成功运行。在Galaxy Tab 7上显示。但是,在LG4上安装到Android 7.0时,出现“连接到播放服务失败”消息。当我选择我的登录帐户时,“不幸的是,我见证(已重命名的应用程序)上载程序已停止”是该应用程序崩溃之前的消息。

最初从git导入代码时,Android Studio 3.01显示了一些过时的库,我对其进行了更新,并找到了一种解决方法,以解决由上述过时的库之一引起的httprequest / httpclient错误。最大的问题与“com.google.android.gms:play-services-auth”和“com.google.android.gms:play-services-plus”有关,在原始示例中为7.8。

Android Studio建议将其更新为当前的11.8,但是当我在代码中出现很多“红色死亡下划线”时,因此我成功使用了“com.google.android.gms:play-services-plus:9.0.0”和com.google.android.gms:play-services-auth:9.0.0。

具体来说,11.8与以下与firebase相关的外部库产生冲突,由于项目中未实现firebase,我不明白。

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

该问题似乎围绕着身份验证展开,但是在哪里可以调试特定的Android版本?

如果有人可能熟悉YouTube Direct Lite,并可以提出解决Android 7上安装问题的建议,这是我的应用程序级别build.gradle:
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'

谢谢你的帮助。

附言事实证明,该问题与AndroidManifest.xml中的<uses-permission android:name="android.permission.GET_ACCOUNTS" />有关,该问题已在Android 6.1>中进行了更改。我在摆弄手机上的应用程序设置时偶然发现了它。 “联系人”是“权限”下列出的唯一选项,当我启用对联系人的访问后,该应用程序将按预期运行。

现在,我需要发现如何以编程方式实现权限

最佳答案

关于无法连接Play Services的消息以及随后的崩溃,与以下事实有关:AndroidManifest.xml中的<uses-permission android:name="android.permission.GET_ACCOUNTS" />自Android 6.1起要求用户明确授予权限。

在Android的示例运行时权限here中找到的以下代码已解决了该问题(尽管该应用在安装后首次运行时崩溃,但随后并未崩溃)。

当主要 Activity 内容 View 加载时:

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

然后请求并设置权限:
// 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);
    }
}

我确定有一些多余的代码可以清除,因为我没有单击任何按钮来请求权限。

关于android - 如何在Android 7中实现YouTube Direct Lite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47928914/

相关文章:

java - 由于 RenderScript,Android 仪器测试失败

video - 如何自动播放多个 youtube 视频并将它们静音?

1 个视频超出了 Youtube API 配额

android - 错误:(26) error: ' ' is incompatible with attribute android:icon (attr) reference

java - 如何将我的应用程序添加到 "Open With"对话框?

android - 在 Android 应用程序中显示特定 Activity 的数据

ios - 带解析API IOS的​​JSON反序列化

python - 使用 youtube-dl 的子进程进行自动歌曲列表下载

ios - 如何使用 Safari 打开 Youtube URL,而不是 Youtube 应用程序

Android:MediaCodec:在 Nexus 上生成的 480x480 视频效果不佳,而 640x640 效果很好