Urlshortener и ошибка 403 в приложении для Android
Это мой первый вопрос о Stackru, и мой мозг сожжен из-за всех прочитанных мной постов и всех проведенных тестов.
В моем приложении я бы добавил сервис Google Short Short URL. Я прочитал этот пост, сгенерировал API-ключ для приложения Android в консоли API Google, вставил ключ в манифест, включил API URL Shortener и установил ограничение квоты на пользователя 50 (в этот момент я я единственный пользователь моего приложения на физическом смартфоне), но мой метод для короткого URL дает мне это:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code": 403,
"errors": [
{
"domain": "usageLimits",
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
"reason": "dailyLimitExceededUnreg",
"extendedHelp": "https://code.google.com/apis/console"
}
],
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
}
Это код моего метода
import android.os.AsyncTask;
import android.util.Log;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.extensions.android.json.AndroidJsonFactory;
import com.google.api.services.urlshortener.Urlshortener;
import com.google.api.services.urlshortener.model.Url;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
[...]
public String shortUrl (String url) {
Log.d(TAG, "Start ShortUrl URL = " + url);
//*** Gruppo AsyncTask ***//
AsyncTask <String, Void, String> shortUrlEngine = new AsyncTask<String, Void, String>() {
@Override
protected void onPreExecute() {
Log.d(TAG, "PreExecute");
}
@Override
protected String doInBackground(String... params) {
Log.d(TAG, "Start doInBackground");
Log.d(TAG, "params[0] = " + params[0]);
Urlshortener.Builder builder = new Urlshortener.Builder (AndroidHttp.newCompatibleTransport(), AndroidJsonFactory.getDefaultInstance(), null);
builder.setApplicationName("it.kabadroid42.testurl");
Urlshortener urlshortener = builder.build();
com.google.api.services.urlshortener.model.Url url = new Url();
url.setLongUrl(params[0]);
try {
url = urlshortener.url().insert(url).execute();
Log.d(TAG, String.valueOf(url.getId()));
return url.getId();
} catch (IOException e) {
Log.d(TAG, String.valueOf(e));
return "Error (1)";
}
}
@Override
protected void onPostExecute(String s) {
Log.d(TAG, "PostExecute");
}
};
//*** Fine ***//
String urlOut = "Error (2)";
try {
urlOut = shortUrlEngine.execute(url).get();
} catch (InterruptedException e) {
Log.d(TAG, "eccezione 1");
e.printStackTrace();
} catch (ExecutionException e) {
Log.d(TAG, "eccezione 2");
e.printStackTrace();
}
return urlOut;
}
Я заметил, что если я добавлю свой корректный API-ключ или подделку в манифест, результат будет тот же. Я думаю, что мое приложение не отправляет API-ключ, но я понятия не имею, почему. Для полноты картины это часть моего AndroidManifest.xml
<application ...>
...
<meta-data
android:name="com.google.android.urlshortener.API_KEY"
android:value="xxxx MY API KEY xxxx"/>
...
</application>
Я пытался переместить метаданные в различное положение, изменить ключ API, но ошибка 403 каждый раз говорила мне привет.
Большое спасибо за любые предложения и извините за мой английский, это не мой родной язык, но во вторник я начинаю курс английского языка:)
1 ответ
Работал с той же проблемой и решил с добавлением setKey(), как показано ниже. Используйте свой ключ Android из консоли API, а не любой веб-ключ, который вы могли бы использовать, если вы использовали старый шортнер через веб-вызов.
try {
url = urlshortener.url().insert(url).setKey({your API Key}).execute();
Log.d(TAG, String.valueOf(url.getId()));
return url.getId();
} catch (IOException e) {
Log.d(TAG, String.valueOf(e));
return "Error (1)";
}