Открыть файл с помощью API Google Диска для Android | ВНУТРЕННЯЯ ОШИБКА

Я пытаюсь использовать API Google Диска для Android, чтобы открыть файл. Из следующего официального учебника у меня есть следующее:

GoogleDriveActivity.class

public class GoogleDriveActivity extends Activity implements GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks {

private GoogleApiClient mGoogleApiClient;
private int REQUEST_CODE_RESOLUTION = 1;
private int REQUEST_CODE_OPENER = 2;
private ListView filesLv;
private DataBufferAdapter<Metadata> mResultsAdapter;
private String mNextPageToken;
private boolean hasMore;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_google_drive);

    filesLv = (ListView) findViewById(R.id.listViewResults);
    hasMore = true;
    mResultsAdapter = new ResultsAdapter(this);
    filesLv.setAdapter(mResultsAdapter);
    filesLv.setOnScrollListener(new AbsListView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
        }

        @Override
        public void onScroll(AbsListView view, int first, int visible, int total) {
            if (mNextPageToken != null && first + visible + 5 < total) {
                retrieveNextPage();
            }
        }
    });
}

private void retrieveNextPage() {
    // retrieve the results for the next page.
    Query query = new Query.Builder()
            .setPageToken(mNextPageToken)
            .build();
    Drive.DriveApi.query(mGoogleApiClient, query)
            .setResultCallback(metadataBufferCallback);
}

private final ResultCallback<DriveApi.MetadataBufferResult> metadataBufferCallback = new
        ResultCallback<DriveApi.MetadataBufferResult>() {
            @Override
            public void onResult(DriveApi.MetadataBufferResult result) {
                if (!result.getStatus().isSuccess()) {
                    return;
                }
                mResultsAdapter.clear();
                mResultsAdapter.append(result.getMetadataBuffer());
                mNextPageToken = result.getMetadataBuffer().getNextPageToken();
                hasMore = mNextPageToken != null;
            }
        };

@Override
public void onResume() {
    super.onResume();
    if (mGoogleApiClient == null) {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Drive.API)
                .addScope(Drive.SCOPE_FILE)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
    }
    mGoogleApiClient.connect();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_RESOLUTION && resultCode == RESULT_OK) {
        mGoogleApiClient.connect();
    }
}

@Override
protected void onPause() {
    if (mGoogleApiClient != null) {
        mGoogleApiClient.disconnect();
    }
    super.onPause();
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    if (!connectionResult.hasResolution()) {
        return;
    }
    try {
        connectionResult.startResolutionForResult(this, REQUEST_CODE_RESOLUTION);
    } catch (IntentSender.SendIntentException e) {
    }

}

@Override
public void onConnected(Bundle bundle) {
    retrieveNextPage();
}

@Override
public void onConnectionSuspended(int i) {
}
}

Класс ResultsAdapter.class:

public class ResultsAdapter extends DataBufferAdapter<Metadata> {

public ResultsAdapter(Context context) {
    super(context, android.R.layout.simple_list_item_1);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = View.inflate(getContext(),
                android.R.layout.simple_list_item_1, null);
    }
    Metadata metadata = getItem(position);
    TextView titleTextView =
            (TextView) convertView.findViewById(android.R.id.text1);
    titleTextView.setText(metadata.getTitle());
    return convertView;
}
}

Я включаю зависимость в файл Gradle следующим образом:

compile 'com.google.android.gms:play-services-drive:7.8.0'

Activity в Manifest.xml выглядит следующим образом:

<activity
            android:name="com.myproject.GoogleDriveActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:screenOrientation="portrait"
            android:windowSoftInputMode="adjustPan">
            <meta-data android:name="com.google.android.apps.drive.APP_ID" android:value="id=<google project number>"/>
</activity>

Обратите внимание, что я добавил SHA1 в соболезнование API Google с именем пакета. Кроме того, поля на экране содержимого заполняются, как описано здесь.

Когда я пытаюсь запустить этот код, я продолжаю получать следующее сообщение об ошибке в обратном вызове onConnectionFailed:

{statusCode=INTERNAL_ERROR, resolution=null}

Любая идея о том, что может пойти не так? Я не могу понять, в чем проблема.


person gsb    schedule 19.08.2015    source источник
comment
Просто чтобы уточнить, где именно вы получаете ошибку? Похоже, ваш GoogleApiClient не подключен, можете ли вы подтвердить, что вызывается метод onConnected?   -  person Arthur Thompson    schedule 20.08.2015
comment
@kroikie спасибо, что указали на это. Я отредактировал свой вопрос. Я получаю сообщение об ошибке обратного вызова onConnectionFailed. Он вообще не подключается.   -  person gsb    schedule 20.08.2015
comment
Не могли бы вы подтвердить, что имя пакета в вашем файле манифеста совпадает с идентификатором приложения в вашем файле gradle и именем пакета в идентификаторе клиента в консоли разработчика?   -  person Arthur Thompson    schedule 20.08.2015
comment
Привет @kroikie. Я нашел проблему и добавил это как ответ на вопрос. Спасибо, что изучили это. Ценить это.   -  person gsb    schedule 20.08.2015


Ответы (1)


Я нашел ответ. Проблема была в debug key. По сути, я выполнил команду keytool и сгенерировал SHA1, которую затем добавил в консоль API в Google. Затем я запустил проект из Android Studio. Это давало мне ошибку.

Затем я создал новое хранилище ключей из Android Studio -> Меню -> Сборка -> Создать подписанный apk. Запустил ту же команду для создания SHA1, которую я загрузил в консоль API. Затем с обновленным файлом apk я смог получить содержимое файла.

Проблема заключалась в том, что ключ не мог быть аутентифицирован Google.

person gsb    schedule 19.08.2015
comment
Вы только что столкнулись с классической ловушкой аутентификации. Последняя попытка/двойная проверка этой проблемы описана здесь. - person seanpj; 20.08.2015