我的Galaxy Nexus今天到了,我做的第一件事就是将我的应用程序加载到它上面,这样我就可以向朋友们展示它了.其部分功能涉及从Google阅读器导入RSS源.但是,在尝试这个时,我得到405方法不允许错误.
这个问题是Ice Cream Sandwich特有的.我附上的代码在Gingerbread和Honeycomb上运行良好.当GET请求神奇地变成POST请求时,我已经将错误追溯到建立连接的那一刻.
/**
* Get the authentication token from Google
* @param auth The Auth Key generated in getAuth()
* @return The authentication token
*/
private String getToken(String auth) {
final String tokenAddress = "https://www.google.com/reader/api/0/token";
String response = "";
URL tokenUrl;
try {
tokenUrl = new URL(tokenAddress);
HttpURLConnection connection = (HttpURLConnection) tokenUrl.openConnection();
connection.setRequestMethod("GET");
connection.addRequestProperty("Authorization", "GoogleLogin auth=" + auth);
connection.setRequestProperty("Content-Type","application/x-www-form-urlendcoded");
connection.setUseCaches(false);
connection.setDoOutput(true);
Log.d(TAG, "Initial method: " + connection.getRequestMethod()); // Still GET at this point
try {
connection.connect();
Log.d(TAG, …Run Code Online (Sandbox Code Playgroud) 带有冰淇淋三明治的设备可以使用屏幕上的软键,这意味着这些按键可以占用一些屏幕.我需要获得真正的屏幕分辨率,而不是分辨率减去软键占用的空间.
我尝试了以下,但都不起作用:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
Log.d("SCREEN RES", "Width: " + width + ". Height: " + height);
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
height = metrics.heightPixels;
width = metrics.widthPixels;
Log.d("SCREEN RES", "Width: " + width + ". Height: " + height);
Run Code Online (Sandbox Code Playgroud)
这是输出:
12-19 20:18:42.012: D/SCREEN RES(20752): Width: 1196. Height: 720
12-19 20:18:42.012: D/SCREEN RES(20752): Width: 1196. Height: 720
Run Code Online (Sandbox Code Playgroud)
真正的屏幕分辨率是1280 x 720像素,而不是1196 x 720像素.
有任何想法吗?
编辑
我正在使用以下代码将应用程序全屏显示:
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
Run Code Online (Sandbox Code Playgroud) 出于某种原因,在使用Ice Cream Sandwich在我的Motorola Xoom上进行测试时,即使我已经实现了事件处理程序,操作栏中的应用程序图标也不可点击.这仅在将targetSdkVersion更改为15后才会发生.如果它是13,它仍然是可点击的,即使在ICS上也是如此.为什么会发生这种情况,如何让它像按钮一样点击?我搜索了文档,找不到任何东西.
谢谢.
更新:这是我的代码:
AndroidManifest.xml中:
...
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:theme="@style/android:Theme.Holo.Light">
...
Run Code Online (Sandbox Code Playgroud)
BaseActivity.java(我的活动都继承自这个类:
...
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in action bar clicked; go home
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
...
Run Code Online (Sandbox Code Playgroud) java android xoom android-4.0-ice-cream-sandwich android-actionbar
我想知道是否有办法检测设备是否有"屏幕按钮"(如Galaxy Nexus或ICS平板电脑)
我的问题是,在具有屏幕按钮的设备上,在操作上,添加溢出按钮(如果溢出),而不是在其他设备上,所以我希望能够预测这种行为.
谢谢您的帮助.
在Android 4.0中,我将标签栏与两个小部件放在一起.在代码中我写小alphabates(新)但在应用程序中它应该始终显示(新)如何在android 4.0中的选项卡上写小alphabates
我试图在webViewClient中打开一个SWF文件,它适用于Android 2.1和2.3.3.但是当我尝试在4.0.4上播放相同的SWF文件时,会导致错误,并且videoPlayer页面中会出现绿屏.
oWebView = (WebView) findViewById(R.id.wvhPlayer);
oWebView.setWebViewClient(new KhWebClient());
oWebView.getSettings().setJavaScriptEnabled(true);
oWebView.getSettings().setPluginsEnabled(true);
oWebView.getSettings().setAllowFileAccess(true);
oWebView.getSettings().setBuiltInZoomControls(true);
String html = " <object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" width=\"100%\" height=\"100%\" id=\"vPlayer\" align=\"middle\">"
+ " <param name=\"movie\" value=\"http://mysite.com/sites/all/modules/player/player.swf?id=0CYj9tI0hpQ"
+ "\" />"
+ " <param name=\"quality\" value=\"high\" />"
+ " <param name=\"bgcolor\" value=\"#000000\" />"
+ " <param name=\"play\" value=\"true\" />"
+ " <param name=\"loop\" value=\"true\" />"
+ " <param name=\"wmode\" value=\"window\" />"
+ " <param name=\"scale\" value=\"showall\" />"
+ " <param name=\"menu\" value=\"true\" />"
+ " <param name=\"devicefont\" value=\"false\" />"
+ " …Run Code Online (Sandbox Code Playgroud) 编辑: 我已经向youtube上传了一个视频,展示了这里的错误:http://www.youtube.com/watch?v = zkDYlgtX5Hk
我有一个非常奇怪的错误,我发现在运行Android 4.03 ICS的三星Galaxy S2上测试我的新网络应用程序.
当您在默认Web浏览器中加载表单然后向下滚动页面时,即使表单元素本身已向上滚动,hitbox/touchable区域似乎仍保留在页面首次加载时它在屏幕上的位置屏幕.
据我所知的少数测试设备,我认为这只发生在三星Galaxy S2上,因为我在Android模拟器中尝试使用相同版本的android并且无法复制问题.我知道这使得它成为一个非常具体的用户群,但是最后我检查了Galaxy s2是我国(澳大利亚)最受欢迎的Android手机,所以找到一个修复程序会很高兴.
我在http://users.tpg.com.au/geoffica/test.html创建了一个非常简单的页面来演示这个
您可以通过执行以下操作来复制问题:
现在我知道你认为这很复杂并且可能很少发生,但是在我为客户构建的表单中,因为元素的位置,hitbox总是与表单的提交按钮重叠,使它成为现实很难点击提交按钮.如果命中框重叠,选择列表也会窃取其他选择列表中的触摸,触摸时会显示错误的选项.
我尝试了很多东西,但到目前为止我发现的唯一解决方法是使用touchstart事件来触发我的提交按钮而不是点击事件.这似乎发生在选择列表的单击事件之前,并阻止它首先进入,但这远非理想,并且不会阻止选择列表窃取页面上其他元素的点击.
我还想过滚动我自己的jquery插件,可能会将选择列表放在屏幕外,然后触摸链接或其他东西来触发他们的点击事件.如果它是移动设备,则无论选择的位置如何,选项都将出现在屏幕上.然而,这将非常麻烦,我需要考虑这对来自PC或ipad的用户产生的影响,例如在下拉列表中显示选项.对我来说听起来很有道理.甚至可能需要一些Galaxy s2特定的浏览器/设备嗅探.
除了不使用选择列表之外,有没有人有这方面的真正解决方法?
html android-browser galaxy android-4.0-ice-cream-sandwich samsung-mobile
目标是拦截来自耳机的广播以及最终的蓝牙,以响应来自耳机的不同类型的点击以改变媒体播放器.此解决方案适用于ICS之前的所有版本.这是我尝试过的一些代码和事情:
....
private BroadcastReceiver mediaButtonReceiver = new MediaButtonIntentReceiver();
....
public void onCreate() {
...
IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
mediaFilter.setPriority(2147483647); // this is bad...I know
this.registerReceiver(mediaButtonReceiver, mediaFilter);
...
}
public class MediaButtonIntentReceiver extends BroadcastReceiver {
private KeyEvent event;
public MediaButtonIntentReceiver() {
super();
}
@Override
public void onReceive(Context context, Intent intent) {
String intentAction = intent.getAction();
if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
return;
}
event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
if (event == null) {
return;
}
try {
int action = event.getAction();
switch(action) {
case KeyEvent.ACTION_UP …Run Code Online (Sandbox Code Playgroud) android media-player android-intent android-4.0-ice-cream-sandwich
我想断开ICS的拨出电话.
我的问题首先是我没有在姜饼中获得IC中的广播它工作正常并且阻止了呼叫但是在ICS中它不是广播.
对于BroadCast我创建了一个服务,并且我PHONE_STATE在ICS中也获得了BroadCast,但当我尝试断开呼叫时,我收到了错误
NO such method name 'getITelephony'
Run Code Online (Sandbox Code Playgroud)
在ICS呼叫中没有断开连接.
我正在使用以下代码断开使用BroadCast的呼叫...
try{
TelephonyManager manager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
Class c = Class.forName(manager.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephony = (ITelephony)m.invoke(manager);
telephony.endCall();
} catch(Exception e){
Log.d("",e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
PhonecallStateBroadcastReceiver.java
与packgename package com.android.internal.telephony;
ITelephony.aidl
interface ITelephony
{
boolean endCall();
void answerRingingCall();
void silenceRinger();
}
Run Code Online (Sandbox Code Playgroud) 我正在探索Android的VpnService的功能.目前,我通过在用户空间重建IP堆栈构建了一个非常基本的请求转发器:我从VpnService的输入流中读取IP数据包,解析它们,对于我不想转发的连接,我尝试重新创建那些VPN连接外部的套接字连接.
我已经明白最后一点是通过VpnService.protect()以下方式实现的:
Socket socket = new Socket();
vpnService.protect(socket);
socket.connect(new InetSocketAddress(
header.getDestinationAddress(), // From my IP datagram header
body.getDestinationPort())); // From the TCP datagram header
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方法导致VPN接口的环回.
虽然上面的代码只是阻塞并最终超时,但我通过Socket.connect(InetSocketAddress)从一个单独的线程调用来观察环回; 连接直接返回到我的VpnService的输入流,并重复该过程.
不用说,这会导致循环.我觉得这样做的原因是在创建套接字时(以及随后的调用VpnService.protect(Socket)),我还没有设置目标IP和端口.
这似乎确实如此,因为通过覆盖VpnService.protect(Socket)和 VpnService.protect(int)我的VpnService实现并在两种情况下调用超级都返回false.
如何正确保护套接字连接?
sockets vpn android packet-capture android-4.0-ice-cream-sandwich