我正在尝试使用需要使用Google电子表格API的Android应用。我是新手,所以我从api的第3版开始:https://developers.google.com/google-apps/spreadsheets/
我按照所有步骤,将所有jar文件下载到项目文件夹中的lib
子文件夹,然后像往常一样添加到Eclipse中的构建路径。因此,虽然没有Java示例来执行Oauth 2.0,但我只是尝试声明:
SpreadsheetService service = new SpreadsheetService("v1");
但是当我模仿这个简单的行时,它给了我一个错误:
java.lang.NoClassDefFoundError: com.google.gdata.client.spreadsheet.SpreadsheetService
我正在使用文档中包含的所有jar,我有导入:
import com.google.gdata.client.spreadsheet.SpreadsheetService;
但我完全迷失了。我不知道还有什么可以开始,连接到Google API并使用电子表格。
答案 0 :(得分:5)
没有OAuth 2.0的示例代码。但是为了安全起见,它建议执行OAuth。您还必须添加以下权限。
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCOUNT_MANAGER"/>
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
示例代码: -
try {
SpreadsheetEntry spreadsheet;
service = new SpreadsheetService("Spreadsheet");
service.setProtocolVersion(SpreadsheetService.Versions.V3);
service.setUserCredentials("username", "password");//permission required to add in Manifest
URL metafeedUrl = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full");
feed = service.getFeed(metafeedUrl, SpreadsheetFeed.class);
List<SpreadsheetEntry> spreadsheets = feed.getEntries();
if (spreadsheets.size() > 0) {
spreadsheet = spreadsheets.get(i);//Get your Spreadsheet
}
} catch (Exception e) {
e.printStackTrace();
}
答案 1 :(得分:4)
非常感谢Scorpion!有用!!我一直在尝试这个问题太久了。 好的,这是我的解决方案: 我开始了一个新项目,包括这些罐子:
gdata-client-1.0
gdata-client-meta-1.0
gdata-core-1.0
gdata-spreadsheet-3.0
gdata-spreadsheet-meta-3.0
guava-13.0.1
和我的代码:
SpreadsheetService spreadsheet= new SpreadsheetService("v1");
spreadsheet.setProtocolVersion(SpreadsheetService.Versions.V3);
try {
spreadsheet.setUserCredentials("username", "password");
URL metafeedUrl = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full");
SpreadsheetFeed feed = spreadsheet.getFeed(metafeedUrl, SpreadsheetFeed.class);
List<SpreadsheetEntry> spreadsheets = feed.getEntries();
for (SpreadsheetEntry service : spreadsheets) {
System.out.println(service.getTitle().getPlainText());
}
} catch (AuthenticationException e) {
e.printStackTrace();
}
当然这是在不在主线程中的不同线程中执行的。 OAuth 2.0没有java文档,但我会尝试,如果我不能这样做,我会在这里问。 再次,非常感谢,我希望在我这个时间工作的时候帮助你。 :)
答案 2 :(得分:3)
这是一个复杂的过程,但它可以完成!我写了blog post来了解基础知识并运行。而且我还发布了一个实际有用的open-source project,但仍然很少。它使用OAuth,因此可以直接从Android的权限模型中提取权限(没有硬编码的电子邮件/密码!)。
你需要一些东西来启动&#34;选择帐户意图&#34;:
View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[]{"com.google"},
false, null, null, null, null);
startActivityForResult(intent, 1);
if (AUTO_HIDE) {
delayedHide(AUTO_HIDE_DELAY_MILLIS);
}
return false;
}
};
然后当该意图返回时,您可以尝试使用返回的令牌(尽管请注意,如果用户第一次必须明确授权您的程序;那就是UserRecoverableAuthException ):
protected void onActivityResult(final int requestCode, final int resultCode,
final Intent data) {
if (requestCode == 1 && resultCode == RESULT_OK) {
final String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
System.err.println(accountName);
(new AsyncTask<String, String,String>(){
@Override
protected String doInBackground(String... arg0) {
try {
// Turn account name into a token, which must
// be done in a background task, as it contacts
// the network.
String token =
GoogleAuthUtil.getToken(
FullscreenActivity.this,
accountName,
"oauth2:https://spreadsheets.google.com/feeds https://docs.google.com/feeds");
System.err.println("Token: " + token);
// Now that we have the token, can we actually list
// the spreadsheets or anything...
SpreadsheetService s =
new SpreadsheetService("Megabudget");
s.setAuthSubToken(token);
// Define the URL to request. This should never change.
// (Magic URL good for all users.)
URL SPREADSHEET_FEED_URL = new URL(
"https://spreadsheets.google.com/feeds/spreadsheets/private/full");
// Make a request to the API and get all spreadsheets.
SpreadsheetFeed feed;
try {
feed = s.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class);
List<SpreadsheetEntry> spreadsheets = feed.getEntries();
// Iterate through all of the spreadsheets returned
for (SpreadsheetEntry spreadsheet : spreadsheets) {
// Print the title of this spreadsheet to the screen
System.err.println(spreadsheet.getTitle().getPlainText());
}
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (UserRecoverableAuthException e) {
// This is NECESSARY so the user can say, "yeah I want
// this app to have permission to read my spreadsheet."
Intent recoveryIntent = e.getIntent();
startActivityForResult(recoveryIntent, 2);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (GoogleAuthException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}}).execute();
} else if (requestCode == 2 && resultCode == RESULT_OK) {
// After the user YAYs or NAYs our permission request, we are
// taken here, so if we wanted to grab the token now we could.
}
}
答案 3 :(得分:3)
(2017年2月)问题(和大多数答案)现在已经过时了:1)GData APIs是上一代Google API。虽然并非所有GData API都已弃用,但all modern Google APIs在2016年执行 使用the Google Data protocol,2)Google released a new Google Sheets API(v4;不是GData),以及3) Android Studio现在是Eclipse上的首选IDE。要使用Google API,您需要获取the Google APIs Client Library for Android(或更常用的Java,the Google APIs Client Library for Java)。现在你已经确定了。
首先,最新的Sheets API比所有旧版本强大得多。最新的API提供旧版本中不可用的功能,即为开发人员提供对Sheet的编程访问,就像使用用户界面一样(创建冻结行,执行单元格格式化,调整行/列,添加数据透视表,创建图表等)。 )。
那就是说,是的,当没有足够好的(工作)示例浮动时,这很难,对吧?在官方文档中,我们尝试将尽可能多的语言中的“快速启动”示例用于帮助您前进。本着这种精神,这里是Android quickstart code sample以及更为笼统的Java Quickstart code sample。为方便起见,这是Sheets API JavaDocs reference。
另一个答案建议使用OAuth2进行数据授权,您可以使用上面快速入门中的此auth代码段以及右侧scope:
// Sheets RO scope
private static final String[] SCOPES = {SheetsScopes.SPREADSHEETS_READONLY};
:
// Initialize credentials and service object
mCredential = GoogleAccountCredential.usingOAuth2(
getApplicationContext(), Arrays.asList(SCOPES))
.setBackOff(new ExponentialBackOff());
如果您对Python没有“过敏”,我使用Sheets API(非移动设备)制作了几个带有更多“真实世界”示例的视频:
最后,请注意Sheets API执行如上所述的文档定向功能。对于文件级别访问,即导入,导出等,您可以使用Google Drive API代替;专门针对移动设备,请使用Google Drive Android API。希望这有帮助!