Android Youtube API V3

GoogleJsonResponseException 403 Forbidden
    {
      "code" : 403,
      "errors" : [ {
        "domain" : "usageLimits",
        "message" : "The request did not specify any Android package name or signing-certificate fingerprint. Please ensure that the client is sending them or use the API Console to update your key restrictions.",
        "reason" : "ipRefererBlocked",
        "extendedHelp" : "https://console.developers.google.com/apis/credentials?project=00000000000"
      } ],
      "message" : "The request did not specify any Android package name or signing-certificate fingerprint. Please ensure that the client is sending them or use the API Console to update your key restrictions."
    }
   
 It looks like you want to access the YouTube API features that need credentials.
This code does not work for an unauthorized user.

   
            YouTube.Search search = mService.search();
            YouTube.Search.List request = search.list("id,snippet");
            request.setOrder("date");
            request.setType("video");
            request.setFields("nextPageToken,pageInfo(totalResults),items(id(videoId),snippet(title,description,thumbnails,publishedAt))");

            request.setKey(m.getString(R.string.google_api_key));
            request.setChannelId("UCCZBv-FBNdxoE87xae9eC6g");
            request.setPageToken("");
            request.setMaxResults((long) 5);
            SearchListResponse response = request.execute();


You need to use GoogleAccountCredential


With an authorized request, this error occurs due to line 
request.setKey(m.getString(R.string.google_api_key));//not work It needs to be deleted! 
//Not set this options 
--> setKey it's crash аuthorized request 
@@@     //REMOVE THIS -->> request.setKey(m.getString(R.string.google_api_key));
            



Example



public class MainActivity extends Activity
        implements EasyPermissions.PermissionCallbacks {
    GoogleAccountCredential mCredential;
    private TextView mOutputText;
    private Button mCallApiButton;
    ProgressDialog mProgress;

    static final int REQUEST_ACCOUNT_PICKER = 1000;
    static final int REQUEST_AUTHORIZATION = 1001;
    static final int REQUEST_GOOGLE_PLAY_SERVICES = 1002;
    static final int REQUEST_PERMISSION_GET_ACCOUNTS = 1003;

    private static final String BUTTON_TEXT = "Call YouTube Data API";
    private static final String PREF_ACCOUNT_NAME = "accountName";
    private static final String[] SCOPES = {YouTubeScopes.YOUTUBE_READONLY};

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout activityLayout = new LinearLayout(this);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
        activityLayout.setLayoutParams(lp);
        activityLayout.setOrientation(LinearLayout.VERTICAL);
        activityLayout.setPadding(16, 16, 16, 16);

        ViewGroup.LayoutParams tlp = new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);

        mCallApiButton = new Button(this);
        mCallApiButton.setText(BUTTON_TEXT);
        mCallApiButton.setOnClickListener(v -> {
            mCallApiButton.setEnabled(false);
            mOutputText.setText("");
            getResultsFromApi();
            mCallApiButton.setEnabled(true);
        });
        activityLayout.addView(mCallApiButton);

        mOutputText = new TextView(this);
        mOutputText.setLayoutParams(tlp);
        mOutputText.setPadding(16, 16, 16, 16);
        mOutputText.setVerticalScrollBarEnabled(true);
        mOutputText.setMovementMethod(new ScrollingMovementMethod());
        mOutputText.setText(
                "Click the \'" + BUTTON_TEXT + "\' button to test the API.");
        activityLayout.addView(mOutputText);

        mProgress = new ProgressDialog(this);
        mProgress.setMessage("Calling YouTube Data API ...");

        setContentView(activityLayout);

        // Initialize credentials and service object.        mCredential = GoogleAccountCredential.usingOAuth2(
                getApplicationContext(), Arrays.asList(SCOPES))
                .setBackOff(new ExponentialBackOff());


    }


    /**     * Attempt to call the API, after verifying that all the preconditions are     * satisfied. The preconditions are: Google Play Services installed, an     * account was selected and the device currently has online access. If any     * of the preconditions are not satisfied, the app will prompt the user as     * appropriate.     */    private void getResultsFromApi() {
        if (!isGooglePlayServicesAvailable()) {
            acquireGooglePlayServices();
        } else if (mCredential.getSelectedAccountName() == null) {
            chooseAccount();
        } else if (!isDeviceOnline()) {
            mOutputText.setText("No network connection available.");
        } else {
            new MakeRequestTask(this, mCredential).execute();
        }
    }

    /**     * Attempts to set the account used with the API credentials. If an account     * name was previously saved it will use that one; otherwise an account     * picker dialog will be shown to the user. Note that the setting the     * account to use with the credentials object requires the app to have the     * GET_ACCOUNTS permission, which is requested here if it is not already     * present. The AfterPermissionGranted annotation indicates that this     * function will be rerun automatically whenever the GET_ACCOUNTS permission     * is granted.     */    @AfterPermissionGranted(REQUEST_PERMISSION_GET_ACCOUNTS)
    private void chooseAccount() {
        if (EasyPermissions.hasPermissions(
                this, Manifest.permission.GET_ACCOUNTS)) {
            String accountName = getPreferences(Context.MODE_PRIVATE)
                    .getString(PREF_ACCOUNT_NAME, null);
            if (accountName != null) {
                mCredential.setSelectedAccountName(accountName);
                getResultsFromApi();
            } else {
                // Start a dialog from which the user can choose an account                startActivityForResult(
                        mCredential.newChooseAccountIntent(),
                        REQUEST_ACCOUNT_PICKER);
            }
        } else {
            // Request the GET_ACCOUNTS permission via a user dialog            EasyPermissions.requestPermissions(
                    this,
                    "This app needs to access your Google account (via Contacts).",
                    REQUEST_PERMISSION_GET_ACCOUNTS,
                    Manifest.permission.GET_ACCOUNTS);
        }
    }

    /**     * Called when an activity launched here (specifically, AccountPicker     * and authorization) exits, giving you the requestCode you started it with,     * the resultCode it returned, and any additional data from it.     *     * @param requestCode code indicating which activity result is incoming.     * @param resultCode  code indicating the result of the incoming     *                    activity result.     * @param data        Intent (containing result data) returned by incoming     *                    activity result.     */    @Override    protected void onActivityResult(
            int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case REQUEST_GOOGLE_PLAY_SERVICES:
                if (resultCode != RESULT_OK) {
                    mOutputText.setText(
                            "This app requires Google Play Services. Please install " +
                                    "Google Play Services on your device and relaunch this app.");
                } else {
                    getResultsFromApi();
                }
                break;
            case REQUEST_ACCOUNT_PICKER:
                if (resultCode == RESULT_OK && data != null &&
                        data.getExtras() != null) {
                    String accountName =
                            data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                    if (accountName != null) {
                        SharedPreferences settings =
                                getPreferences(Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = settings.edit();
                        editor.putString(PREF_ACCOUNT_NAME, accountName);
                        editor.apply();
                        mCredential.setSelectedAccountName(accountName);
                        getResultsFromApi();
                    }
                }
                break;
            case REQUEST_AUTHORIZATION:
                if (resultCode == RESULT_OK) {
                    getResultsFromApi();
                }
                break;
        }
    }

    /**     * Respond to requests for permissions at runtime for API 23 and above.     *     * @param requestCode  The request code passed in     *                     requestPermissions(android.app.Activity, String, int, String[])     * @param permissions  The requested permissions. Never null.     * @param grantResults The grant results for the corresponding permissions     *                     which is either PERMISSION_GRANTED or PERMISSION_DENIED. Never null.     */    @Override    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        EasyPermissions.onRequestPermissionsResult(
                requestCode, permissions, grantResults, this);
    }

    /**     * Callback for when a permission is granted using the EasyPermissions     * library.     *     * @param requestCode The request code associated with the requested     *                    permission     * @param list        The requested permission list. Never null.     */    @Override    public void onPermissionsGranted(int requestCode, List<String> list) {
        // Do nothing.    }

    /**     * Callback for when a permission is denied using the EasyPermissions     * library.     *     * @param requestCode The request code associated with the requested     *                    permission     * @param list        The requested permission list. Never null.     */    @Override    public void onPermissionsDenied(int requestCode, List<String> list) {
        // Do nothing.    }

    /**     * Checks whether the device currently has a network connection.     *     * @return true if the device has a network connection, false otherwise.     */    private boolean isDeviceOnline() {
        ConnectivityManager connMgr =
                (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        return (networkInfo != null && networkInfo.isConnected());
    }

    /**     * Check that Google Play services APK is installed and up to date.     *     * @return true if Google Play Services is available and up to     * date on this device; false otherwise.     */    private boolean isGooglePlayServicesAvailable() {
        GoogleApiAvailability apiAvailability =
                GoogleApiAvailability.getInstance();
        final int connectionStatusCode =
                apiAvailability.isGooglePlayServicesAvailable(this);
        return connectionStatusCode == ConnectionResult.SUCCESS;
    }

    /**     * Attempt to resolve a missing, out-of-date, invalid or disabled Google     * Play Services installation via a user dialog, if possible.     */    private void acquireGooglePlayServices() {
        GoogleApiAvailability apiAvailability =
                GoogleApiAvailability.getInstance();
        final int connectionStatusCode =
                apiAvailability.isGooglePlayServicesAvailable(this);
        if (apiAvailability.isUserResolvableError(connectionStatusCode)) {
            showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
        }
    }


    /**     * Display an error dialog showing that Google Play Services is missing     * or out of date.     *     * @param connectionStatusCode code describing the presence (or lack of)     *                             Google Play Services on this device.     */    void showGooglePlayServicesAvailabilityErrorDialog(
            final int connectionStatusCode) {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        Dialog dialog = apiAvailability.getErrorDialog(
                MainActivity.this,
                connectionStatusCode,
                REQUEST_GOOGLE_PLAY_SERVICES);
        dialog.show();
    }


    private class MakeRequestTask extends AsyncTask<Void, Void, List<String>> {
        private final MainActivity m;
        private com.google.api.services.youtube.YouTube mService = null;
        private Exception mLastError = null;

        MakeRequestTask(MainActivity mainActivity, GoogleAccountCredential credential) {
            this.m = mainActivity;
            HttpTransport transport = AndroidHttp.newCompatibleTransport();
            JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
            mService = new com.google.api.services.youtube.YouTube.Builder(
                    transport, jsonFactory, credential)
                    .setApplicationName(mainActivity.getString(R.string.app_name))
                    .build();
        }

        /**         * Background task to call YouTube Data API.         *         * @param params no parameters needed for this task.         */        @Override        protected List<String> doInBackground(Void... params) {
            try {
                return getDataFromApi();
            } catch (Exception e) {
                mLastError = e;
                cancel(true);
                return null;
            }
        }

        /**         * Fetch information about the "GoogleDevelopers" YouTube channel.         *         * @return List of Strings containing information about the channel.         * @throws IOException         */        private List<String> getDataFromApi() throws IOException {
            List<String> channelInfo = new ArrayList<String>();
            
            YouTube.Search search = mService.search();
            YouTube.Search.List request = search.list("id,snippet");
            request.setOrder("date");
            request.setType("video");
            request.setFields("nextPageToken,pageInfo(totalResults),items(id(videoId),snippet(title,description,thumbnails,publishedAt))");

            request.setChannelId("UCCZBv-FBNdxoE87xae9eC6g");
            request.setPageToken("");
            request.setMaxResults((long) 5);
            SearchListResponse response = request.execute();
            if (response != null) {
//                    Log.i(TAG, "run_yt_repo: "//                            +"https://www.googleapis.com/youtube/v3/search?part=snippet,id&order=date&\n" +//                            "            type=video&\n" +//                            "            fields=nextPageToken,pageInfo(totalResults),items(id(videoId),snippet(title,thumbnails,publishedAt))&\n" +//                            "            key="+Const.DEVELOPER_KEY+"&\n" +//                            "            channelId="+this.mChannelId+"&pageToken=&maxResults="+Const.VIDEO_LIMIT);                List<SearchResult> mm = response.getItems();
                if (mm != null) {
                    channelInfo.add(mm.toString());
                }
            }


            /**             * ====================================================================             */
            ChannelListResponse result = mService.channels().list("snippet,contentDetails,statistics")
                    .setForUsername("GoogleDevelopers")
                    .execute();
            List<Channel> channels = result.getItems();
            if (channels != null) {
                Channel channel = channels.get(0);
                channelInfo.add("This channel's ID is " + channel.getId() + ". " +
                        "Its title is '" + channel.getSnippet().getTitle() + ", " +
                        "and it has " + channel.getStatistics().getViewCount() + " views.");
            }
            return channelInfo;
        }

        @Override        protected void onPreExecute() {
            m.mOutputText.setText("");
            m.mProgress.show();
        }

        @Override        protected void onPostExecute(List<String> output) {
            m.mProgress.hide();
            if (output == null || output.size() == 0) {
                m.mOutputText.setText("No results returned.");
            } else {
                output.add(0, "Data retrieved using the YouTube Data API:");
                m.mOutputText.setText(TextUtils.join("\n", output));
            }
        }

        @Override        protected void onCancelled() {
            m.mProgress.hide();
            if (mLastError != null) {
                if (mLastError instanceof GooglePlayServicesAvailabilityIOException) {
                    m.showGooglePlayServicesAvailabilityErrorDialog(
                            ((GooglePlayServicesAvailabilityIOException) mLastError)
                                    .getConnectionStatusCode());
                } else if (mLastError instanceof UserRecoverableAuthIOException) {
                    m.startActivityForResult(
                            ((UserRecoverableAuthIOException) mLastError).getIntent(),
                            MainActivity.REQUEST_AUTHORIZATION);
                } else {
                    m.mOutputText.setText("The following error occurred:\n"                            + mLastError.getMessage());
                }
            } else {
                m.mOutputText.setText("Request cancelled.");
            }
        }
    }


    private static final String TAG = "@@@";


}

Комментариев нет:

Отправить комментарий