如何解决引起原因:libcore.io.ErrnoException:recvfrom失败:ECONNRESET由对等方重置连接和sendto失败:EPIPE断开的管道
请不要将其标记为重复
你好 我正在创建一个Android应用,以从Google日历获取事件。我的设备没有Google Play服务,这是设备Philips 10bdl3051t / 02和Android版本4.4.4。 我已经通过App Auth从浏览器授权了用户,我已经获得了授权令牌并能够获取事件。该令牌在大约一小时内保持有效,然后需要刷新。 我正在使用以下代码刷新令牌。问题在于,有时它没有刷新的令牌并抛出此异常。
原因:libcore.io.ErrnoException:recvfrom失败:ECONNRESET(对等方重置连接)
原因:libcore.io.ErrnoException:sendto失败:EPIPE(管道损坏)
代码段以刷新令牌
private void checkGoogleCalendarRESTApiAuthToken() {
SharedPreferences settings = getSharedPreferences(PREFS_FILE,0);
SharedPreferences.Editor editor = settings.edit();
// only refresh the token when it is about to expire
long timeDifference = settings.getLong("googleCalendarRESTApiAccessTokenExpiry",new Date().getTime()) - new Date().getTime();
Log.d("authtoken"," googleCalendarRESTApiAccessTokenExpiry : " + String.valueOf(settings.getLong("googleCalendarRESTApiAccessTokenExpiry",new Date().getTime())));
Log.d("authtoken"," timeDifference: " + String.valueOf(timeDifference));
if (timeDifference < 20) {
Thread tokenRefreshTask = new Thread(){
@Override
public void run() {
Log.d("authtoken"," tokenRefreshTask: " );
mAuthState.performActionWithFreshTokens(new AuthorizationService(context),new AuthState.AuthStateAction() {
@Override
public void execute(@Nullable String accessToken,@Nullable String idToken,@Nullable AuthorizationException exception) {
Log.d("authtoken"," performActionWithFreshTokens: " );
editor.putString("googleCalendarRESTApiAccessToken",mAuthState.getAccessToken());
editor.putLong("googleCalendarRESTApiAccessTokenExpiry",mAuthState.getAccessTokenExpirationTime());
editor.apply();
HttpTransport transport = AndroidHttp.newCompatibleTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
GoogleCredential googleAccountCredential = new GoogleCredential().setAccessToken(mAuthState.getAccessToken());
GoogleService = new com.google.api.services.calendar.Calendar.Builder(transport,jsonFactory,googleAccountCredential).build();
Log.d("authtoken"," getNeedsTokenRefresh: " + String.valueOf(mAuthState.getNeedsTokenRefresh()));
Log.d("authtoken"," getAccessTokenExpirationTime: " + String.valueOf(mAuthState.getAccessTokenExpirationTime()));
Log.d("authtoken"," getAccessToken: " + String.valueOf(mAuthState.getAccessToken()));
Log.d("authtoken"," isAuthorized: " + String.valueOf(mAuthState.isAuthorized()));
Log.d("authtoken"," getLastTokenResponse: " + String.valueOf(mAuthState.getLastTokenResponse()));
Log.d("authtoken"," getRefreshToken: " + String.valueOf(mAuthState.getRefreshToken()));
Log.d("authtoken"," getLastAuthorizationResponse: " + String.valueOf(mAuthState.getLastAuthorizationResponse()));
}
});
}
};tokenRefreshTask.start();
}
}
此设备具有通过此代码控制的侧面LED,此代码每20秒运行一次,以使LED状态与日历事件保持同步。可能是这段代码造成了问题,如果发现任何问题,请提出修改建议。
// ledStripsColor = "#00FF00" for green
// ledStripsColor = "#FF0000" for red
// ledStripsMode = true
private void philipsLed(String ledStripsColor,boolean ledStripsMode) {
Thread testing = new Thread() {
@Override
public void run() {
Socket socket = null;
OutputStream writer = null;
int stripsColor = Color.parseColor(ledStripsColor);
int mode = 0;
if (ledStripsMode) {
mode = 1; // 1 > turn on & 0 > turn off
} else {
mode = 0;
}
// Message //
int messageSize = 9;
int monitorId = 1;
int groupId = 0;
int command = 243; // To control the LED Strip
int colorR = Color.red(stripsColor);
int colorG = Color.green(stripsColor);
int colorB = Color.blue(stripsColor);
int checkSum = 0;
List<Integer> list = new ArrayList<Integer>();
list.clear();
list.add(messageSize);
list.add(monitorId);
list.add(groupId);
list.add(command);
list.add(mode);
list.add(colorR);
list.add(colorG);
list.add(colorB);
for (int a = 0; a < 8; a++) {
checkSum = checkSum ^ list.get(a);
}
try {
// The server and the client is the same device so I used the loopback ip address.
String ipAddress = "127.0.0.1";
int portNo = 5000;
socket = new Socket(ipAddress,portNo);
socket.setKeepAlive( false );
writer = socket.getOutputStream();
writer.write((byte) messageSize);
writer.write((byte) monitorId);
writer.write((byte) groupId);
writer.write((byte) command);
writer.write((byte) mode);
writer.write((byte) colorR);
writer.write((byte) colorG);
writer.write((byte) colorB);
writer.write((byte) checkSum);
writer.flush();
writer.close();
socket.close();
// I have to run it multiple times as somehow it didn't change the colors of the LEDs at first time.
// No.2 //
socket = new Socket(ipAddress,portNo);
socket.setKeepAlive( false );
writer = socket.getOutputStream();
sleep(100);
writer.write((byte) messageSize);
writer.write((byte) monitorId);
writer.write((byte) groupId);
writer.write((byte) command);
writer.write((byte) mode);
writer.write((byte) colorR);
writer.write((byte) colorG);
writer.write((byte) colorB);
writer.write((byte) checkSum);
writer.flush();
writer.close();
socket.close();
// I have to run it multiple times as somehow it didn't change the colors of the LEDs at first time.
// No.3 //
socket = new Socket(ipAddress,portNo);
socket.setKeepAlive( false );
writer = socket.getOutputStream();
sleep(100);
writer.write((byte) messageSize);
writer.write((byte) monitorId);
writer.write((byte) groupId);
writer.write((byte) command);
writer.write((byte) mode);
writer.write((byte) colorR);
writer.write((byte) colorG);
writer.write((byte) colorB);
writer.write((byte) checkSum);
writer.flush();
writer.close();
socket.close();
Log.d("tag : ","color send");
} catch (final Exception e) {
// TODO Auto-generated catch block
Log.d("tag : ","exception : " + e.getMessage());
if (Toggle.toggle_Debug) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"exception : " + e.getMessage(),Toast.LENGTH_SHORT).show();
}
});
}
e.printStackTrace();
}
}
};
testing.start();
}
谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。