标签: android-4.0-ice-cream-sandwich

Android 4.0 ICS将HttpURLConnection GET请求转换为POST请求

我的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)

java android google-reader android-4.0-ice-cream-sandwich

11
推荐指数
3
解决办法
1万
查看次数

获得冰淇淋三明治的真实屏幕分辨率

带有冰淇淋三明治的设备可以使用屏幕上的软键,这意味着这些按键可以占用一些屏幕.我需要获得真正的屏幕分辨率,而不是分辨率减去软键占用的空间.

我尝试了以下,但都不起作用:

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)

android screen-resolution android-4.0-ice-cream-sandwich

11
推荐指数
1
解决办法
4973
查看次数

Android 4.0/ICS - 操作栏上的应用程序图标无法点击

出于某种原因,在使用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

11
推荐指数
1
解决办法
4088
查看次数

Android ICS:如何检测设备是否具有"屏幕后退/主页按钮"(如Galaxy Nexus)

我想知道是否有办法检测设备是否有"屏幕按钮"(如Galaxy Nexus或ICS平板电脑)

我的问题是,在具有屏幕按钮的设备上,在操作上,添加溢出按钮(如果溢出),而不是在其他设备上,所以我希望能够预测这种行为.

谢谢您的帮助.

android menu android-4.0-ice-cream-sandwich

11
推荐指数
1
解决办法
4494
查看次数

Tab小部件总是在android 4.0中的大写字母表中

在此输入图像描述在Android 4.0中,我将标签栏与两个小部件放在一起.在代码中我写小alphabates(新)但在应用程序中它应该始终显示(新)如何在android 4.0中的选项卡上写小alphabates

java tabs android tabwidget android-4.0-ice-cream-sandwich

11
推荐指数
2
解决办法
6982
查看次数

在ICS上的webViewClient中播放SWF文件?

我试图在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)

flash android android-4.0-ice-cream-sandwich

11
推荐指数
1
解决办法
1667
查看次数

网页表格上的Android浏览器/三星Galaxy SII滚动错误.选择列表hitboxes不滚动

编辑: 我已经向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创建了一个非常简单的页面来演示这个

您可以通过执行以下操作来复制问题:

  1. 在Galaxy S2上加载页面
  2. 滚动浏览器,使页面完全填满屏幕,地址栏在屏幕顶部.
  3. 在选择框的位置,将手指放在屏幕一侧,作为选择列表所在位置的标记.
  4. 向下滚动页面任何距离,(同时仍然保持选择列表在屏幕上)然后触摸选择列表的空白区域,选项应出现在屏幕上.它可能需要一些尝试才能实现,但它会发生.

现在我知道你认为这很复杂并且可能很少发生,但是在我为客户构建的表单中,因为元素的位置,hitbox总是与表单的提交按钮重叠,使它成为现实很难点击提交按钮.如果命中框重叠,选择列表也会窃取其他选择列表中的触摸,触摸时会显示错误的选项.

我尝试了很多东西,但到目前为止我发现的唯一解决方法是使用touchstart事件来触发我的提交按钮而不是点击事件.这似乎发生在选择列表的单击事件之前,并阻止它首先进入,但这远非理想,并且不会阻止选择列表窃取页面上其他元素的点击.

我还想过滚动我自己的jquery插件,可能会将选择列表放在屏幕外,然后触摸链接或其他东西来触发他们的点击事件.如果它是移动设备,则无论选择的位置如何,选项都将出现在屏幕上.然而,这将非常麻烦,我需要考虑这对来自PC或ipad的用户产生的影响,例如在下拉列表中显示选项.对我来说听起来很有道理.甚至可能需要一些Galaxy s2特定的浏览器/设备嗅探.

除了不使用选择列表之外,有没有人有这方面的真正解决方法?

html android-browser galaxy android-4.0-ice-cream-sandwich samsung-mobile

11
推荐指数
1
解决办法
9258
查看次数

MediaButtonIntentReceiver无法在Android 4.0+中运行

目标是拦截来自耳机的广播以及最终的蓝牙,以响应来自耳机的不同类型的点击以改变媒体播放器.此解决方案适用于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

11
推荐指数
1
解决办法
9049
查看次数

没有这样的方法getITelephony断开Call

我想断开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)

AndroidMaifest.xml

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 broadcastreceiver android-4.0-ice-cream-sandwich

11
推荐指数
1
解决办法
3546
查看次数

保护VpnService中的套接字

我正在探索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

11
推荐指数
2
解决办法
8413
查看次数