www.91084.com

GVKun编程网logo

Android ICS上的ACCESS_NETWORK_STATE权限(android accessibilityservice)

22

在本文中,我们将为您详细介绍AndroidICS上的ACCESS_NETWORK_STATE权限的相关知识,并且为您解答关于androidaccessibilityservice的疑问,此外,我们还会

在本文中,我们将为您详细介绍Android ICS上的ACCESS_NETWORK_STATE权限的相关知识,并且为您解答关于android accessibilityservice的疑问,此外,我们还会提供一些关于(OK) Android devices don''t know route to a host located in the same network、Android Browser学习十四 NetworkStateHandler网络状态监听和处理、Android NDK – 构建TessTwo(适用于Android的Tesseract工具的分支) – ndk-build失败、android – ACTION_PICK_WIFI_NETWORK在具有可用网络的对话框上的有用信息。

本文目录一览:

Android ICS上的ACCESS_NETWORK_STATE权限(android accessibilityservice)

Android ICS上的ACCESS_NETWORK_STATE权限(android accessibilityservice)

我在应用程序清单中声明了权限ACCESS_NETWORK_STATE,如下所示.

<uses-permission  android:name="android.permission.ACCESS_NETWORK_STATE"/>

Android 2.x上的一切都很好.但是在Android ICS上,它失败了以下log cat.

 java.lang.SecurityException: ConnectivityService: Neither user 10093
 nor current process has android.permission.ACCESS_NETWORK_STATE. at
 android.os.Parcel.readException(Parcel.java:1327) at
 android.os.Parcel.readException(Parcel.java:1281) at
 android.net.IConnectivityManager$Stub$Proxy.getActiveNetworkInfo(IConnectivityManager.java:663)
 at
 android.net.ConnectivityManager.getActiveNetworkInfo(ConnectivityManager.java:455)
 at com.tapfortap.AdView.getNetwork(AdView.java:146) at
 com.tapfortap.AdView.loadAdsWithAppId(AdView.java:133) at
 com.tapfortap.AdView.access$100(AdView.java:47) at
 com.tapfortap.AdView$1$1.run(AdView.java:88) at
 android.os.Handler.handleCallback(Handler.java:605) at
 android.os.Handler.dispatchMessage(Handler.java:92) at
 android.os.Looper.loop(Looper.java:137) at
 android.app.ActivityThread.main(ActivityThread.java:4503) at
 java.lang.reflect.Method.invokeNative(Native Method) at
 java.lang.reflect.Method.invoke(Method.java:511) at
 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) at
 dalvik.system.NativeStart.main(Native Method)

解决方法:

这应该是Android ICS框架的一个bug.我刚刚通过再次添加此权限来解决此问题:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

难以置信的!.

(OK) Android devices don''t know route to a host located in the same network

(OK) Android devices don''t know route to a host located in the same network


http://superuser.com/questions/701956/android-devices-dont-know-route-to-a-host-located-in-the-same-network


Not sure that this is your problem, but some wifi routers and access points have a feature called "Station Separation" or "Wireless Isolation", that restricts connected devices from talking to each other. When this feature is enabled, the access point will not route packets between different connected devices: only between devices and the uplink port.

The feature is intended for business networks offering guest access, where services like printers, servers, and network shares are all connected via the wired lan, so you don''t really need wireless-wireless communication, and it helps keeps guests separated from the sensitive business network.


Android Browser学习十四 NetworkStateHandler网络状态监听和处理

Android Browser学习十四 NetworkStateHandler网络状态监听和处理

其实浏览器的网络监听和处理不过是通知给WebView进行, 没有那么多复杂的操作, 使用了NetworkStateHandler这个类来进行处理

Controller中初始化这个类

 mNetworkHandler = new NetworkStateHandler(mActivity, this); //网络变化监听

/**
 * Handle network state changes
 * 处理网络变化
 */
public class NetworkStateHandler {

    Activity mActivity;
    Controller mController;

    // monitor platform changes
    private IntentFilter mNetworkStateChangedFilter;
    private BroadcastReceiver mNetworkStateIntentReceiver;
    private boolean mIsNetworkUp;

    public NetworkStateHandler(Activity activity, Controller controller) {
        mActivity = activity;
        mController = controller;
        // Find out if the network is currently up.
        ConnectivityManager cm = (ConnectivityManager) mActivity
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        if (info != null) {
            mIsNetworkUp = info.isAvailable(); //是否可以连接网络
        }

        /*
         * enables registration for changes in network status from http stack
         * 网络变化监听的filter 和receiver
         */
        mNetworkStateChangedFilter = new IntentFilter();
        mNetworkStateChangedFilter.addAction(
                ConnectivityManager.CONNECTIVITY_ACTION);
        mNetworkStateIntentReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals(
                        ConnectivityManager.CONNECTIVITY_ACTION)) {

                    NetworkInfo info = intent.getParcelableExtra(
                            ConnectivityManager.EXTRA_NETWORK_INFO);
                    String typeName = info.getTypeName(); //获取网络类型是wifi还是mobile
                    String subtypeName = info.getSubtypeName();//hspa 之类
                    sendNetworkType(typeName.toLowerCase(),
                            (subtypeName != null ? subtypeName.toLowerCase() : ""));

                    //网络是否连通
                    boolean noConnection = intent.getBooleanExtra(
                            ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
                    

                    onNetworkToggle(!noConnection);
                }
            }
        };

    }

    void onPause() { //在pause中解注册
        // unregister network state listener
        mActivity.unregisterReceiver(mNetworkStateIntentReceiver);
    }

    void onResume() {//在resume中注册
        mActivity.registerReceiver(mNetworkStateIntentReceiver,
                mNetworkStateChangedFilter);
    }

    /**
     * connectivity manager says net has come or gone... inform the user
     * @param up true if net has come up, false if net has gone down
     */
    void onNetworkToggle(boolean up) {
        if (up == mIsNetworkUp) {
            return;
        }
        mIsNetworkUp = up;
        WebView w = mController.getCurrentWebView();
        if (w != null) {
            w.setNetworkAvailable(up);//告诉webview 网络是否可以联通
        }
    }

    boolean isNetworkUp() {
        return mIsNetworkUp;
    }

    private void sendNetworkType(String type, String subtype) {
        WebView w = mController.getCurrentWebView();
        if (w != null) {
        	//通知内核当前的网络信息
            w.setNetworkType(type, subtype);
        }
    }

}

至此浏览器的分析基本上就结束了, 当然也不是特别全面, 回头看去, 也积累了很多东西, 多看代码, 每天积累一些, 对发展是又好处的.


Android NDK – 构建TessTwo(适用于Android的Tesseract工具的分支) – ndk-build失败

Android NDK – 构建TessTwo(适用于Android的Tesseract工具的分支) – ndk-build失败

当我运行ndk-build时,它会因以下错误而抱怨:

$ndk-build
make: /…/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc: Command not found

Compile arm : jpeg <= jcapimin.c
make: /…/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc: Command not found

make: *** [obj/local/armeabI/Objs/jpeg/jcapimin.o] Error 127

问题是虽然它说“命令未找到”,但上面的路径中存在“arm-linux-androideabi-gcc”.即使我直接从/…/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/运行“arm-linux-androideabi-gcc”,也会出现“未找到命令”的相同错误

我还将./toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin添加到我的PATH中,但仍然收到相同的错误.即使我尝试了不同版本的ndk(7,7b,6b)仍然是同样的错误!在我看来,上面的gcc适用于32位机器,而我的机器是“Linux 2.6.32-37-server x86_64”.但我想ndk包应该适用于32位和64位.我对吗?在使用之前我需要编译或构建ndk吗?我假设下载和解包是我所要做的.对?怎么样sdk?我刚下载并将其解压缩到我拥有的ndk文件夹中.我是否需要将它们配置为相互协作

最佳答案
我遇到了同样的问题.你是对的,问题是由于尝试在64位内核上运行32位二进制文​​件.

我通过安装32位兼容库在Ubuntu 11.10上解决了它:

sudo apt-get install ia32-libs

android – ACTION_PICK_WIFI_NETWORK在具有可用网络的对话框上

android – ACTION_PICK_WIFI_NETWORK在具有可用网络的对话框上

我正在尝试创建一个显示类似ACTION_PICK_WIFI_NETWORK的对话框,但不是打开 Android设置/ WiFi而是在对话框上打开它,如果可能的话,用户可以连接到该对话框中可用的任何网络.我目前正在打开一个带有Android中可用Wi-Fi网络列表的Dialog,但这个列表与Android设置/ WiFi不同,这就是为什么我要问是否可以打开此ACTION_PICK_WIFI_NETWORK一个对话框并使用它.如果不可能我如何连接到网络点击我的对话框中的项目与WiFi可用?

到目前为止我尝试过的是

我有一个broadcastReceiver()

wifiReceiver = new broadcastReceiver(){
@Override
  public void onReceive(Context c,Intent intent){  
       if(mWifiManager != null) {
          List<ScanResult> results = mWifiManager.getScanResults();
          showWifiListDialog(results);
       }
  }
};

RegisterReceiver()

registerReceiver(wifiReceiver,new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

这是WifiScan的方法

private void startWifiScans() {
 mWifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
 mWifiManager.startScan();
}

这是一个简单的Dialog,它显示了SCAN_RESULTS_AVAILABLE_ACTION

private void showWifiListDialog(List<ScanResult> results) {
    AlertDialog.Builder builderSingle = new AlertDialog.Builder(
            this);
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
            this,android.R.layout.select_dialog_item);

    for (ScanResult r: results) {
        if(r == null || r.SSID == null) continue;
        if("".equalsIgnoreCase(r.SSID.trim())) continue;
        String name = r.SSID.replace("\"","");
        arrayAdapter.add(name);
    }
    builderSingle.setNegativeButton(getString(R.string.cancel),new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog,int which) {
                    dialog.dismiss();
                }
            });
    builderSingle.setAdapter(arrayAdapter,int which) {
                    String strName = arrayAdapter.getItem(which);
                    Toast.makeText(getApplicationContext(),"Selected "+strName,Toast.LENGTH_SHORT).show();
                }
            });
    AlertDialog dialog = builderSingle.create();
    dialog.show();
}

图像示例

This和this是我正在寻找的例子.

编辑(这是我现在看到我的对话但是我不喜欢它……)

我想用带有信号强度的图标向网络显示像android一样的example.我想我需要一个listadapter左右?然后添加网络名称,强度连接,图标等…我错了吗?

对there几乎同样的问题..

我想通过通知打开它,显然无论我是在那个APP还是其他APP上都没关系…我只想打开它作为一个对话框,让用户看看用户在看什么.

现在我得到的是:

我正在使用主题,但它没有做我想要的.

<style name="dialogtest" parent="AppTheme">
    <item name="android:windowFrame">@android:color/transparent</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:background">@android:color/transparent</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

这是风格,我称之为:

protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.dialogtest);
    super.onCreate(savedInstanceState);

解决方法

从ui的角度来看,您需要一个自定义适配器:

private class WifiAdapter extends ArrayAdapter<ScanResult> {

    public WifiAdapter(Context context,int resource,List<ScanResult> objects) {
        super(context,resource,objects);
    }

    @Override
    public View getView(int position,View convertView,ViewGroup parent) {
        if (convertView == null) {
            convertView = getLayoutInflater().inflate(R.layout.wifi_item,parent,false);
        }
        ScanResult result = getItem(position);
        ((TextView) convertView.findViewById(R.id.wifi_name)).setText(formatSSDI(result));
        ((ImageView) convertView.findViewById(R.id.wifi_img)).setimageLevel(getnormalizedLevel(result));
        return convertView;
    }

    private int getnormalizedLevel(ScanResult r) {
        int level = WifiManager.calculateSignalLevel(r.level,5);
        Log.e(getClass().getSimpleName(),"level " + level);
        return level;
    }

    private String formatSSDI(ScanResult r) {
        if (r == null || r.SSID == null || "".equalsIgnoreCase(r.SSID.trim())) {
            return "no data";
        }
        return r.SSID.replace("\"","");
    }

我稍微改变了你的showWifiListDialog:

private void showWifiListDialog(List<ScanResult> results) {
    Collections.sort(results,new Comparator<ScanResult>() {
        @Override
        public int compare(ScanResult lhs,ScanResult rhs) {
            return rhs.level > lhs.level ? 1 : rhs.level < lhs.level ? -1 : 0;
        }
    });
    AlertDialog.Builder builderSingle = new AlertDialog.Builder(
            this);
    final WifiAdapter arrayAdapter = new WifiAdapter(
            this,android.R.layout.select_dialog_item,results);

    builderSingle.setNegativeButton(getString(android.R.string.cancel),int which) {
                    String strName = arrayAdapter.getItem(which).SSID;
                    Toast.makeText(getApplicationContext(),"Selected " + strName,Toast.LENGTH_SHORT).show();
                }
            });
    AlertDialog dialog = builderSingle.create();
    dialog.show();
}

Wifi项目是

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <TextView
        android:textSize="16sp"
        android:padding="5dp"
        android:layout_gravity="center_vertical"
        android:id="@+id/wifi_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <ImageView
        android:id="@+id/wifi_img"
        android:layout_gravity="center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/wifi_level" />
</LinearLayout>

而drawable wifi_level是

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@drawable/ic_signal_wifi_0_bar_black_24dp"
        android:maxLevel="0" />
    <item
        android:drawable="@drawable/ic_signal_wifi_1_bar_black_24dp"
        android:maxLevel="1" />
    <item
        android:drawable="@drawable/ic_signal_wifi_2_bar_black_24dp"
        android:maxLevel="2" />
    <item
        android:drawable="@drawable/ic_signal_wifi_3_bar_black_24dp"
        android:maxLevel="3" />

    <item
        android:drawable="@drawable/ic_signal_wifi_4_bar_black_24dp"
        android:maxLevel="4" />
</level-list>

我从here开始拿了五个png

对于Connection,答案是肯定的,应该是可能的.至少相应的文件.您可以实例化WifiConfiguration的对象,并使用您要连接的网络的信息(SSID和密码)提供它.这不是一件简单的事情.如果你必须考虑不同种类的密钥加密,(WPA,WEP,免费wifi).一旦你填满了对象,就必须打电话

mWifiManager.disconect();
int resId = mWifiManager.addNetwork(config);
mWifiManager.enableNetwork(resId,true);

编辑:

如果要显示带或不带挂锁的wifi信号强度图标,可以使用自定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="wifi">
        <attr name="state_locked" format="boolean" />
    </declare-styleable>
</resources>

并在ImageView的子类中更新其状态:

public class WifiImageView extends ImageView {

private static final int[] STATE_LOCKED = {R.attr.state_locked};
private boolean mWifiLocked;

public WifiImageView(Context context,AttributeSet attrs) {
    super(context,attrs);
}

@Override
public int[] onCreateDrawableState(int extraSpace) {
    final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
    if (mWifiLocked) {
        mergeDrawableStates(drawableState,STATE_LOCKED);
    }
    return drawableState;
}

public void setStateLocked(boolean locked) {
    mWifiLocked = locked;
    refreshDrawableState();
}

}

现在假设你的WifeImageView的android:src是一个选择器

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto">
    <item custom:state_locked="false" android:drawable="@drawable/wifi_level" />
    <item custom:state_locked="true" android:drawable="@drawable/wifi_level_lock" />
</selector>

在您的适配器中,您可以轻松地在两个级别列表之间切换,添加以下两行代码

boolean protectedWifi = result.capabilities.contains ("WEP") || result.capabilities.contains("WPA");
 ((WifiImageView) convertView.findViewById(R.id.wifi_img)).setStateLocked(protectedWifi);

如果result.capabilities包含WEP或WPA,则setWifi被评估为true,并且setStateLocked(protectedWifi);将根据其值在两个级别列表之间切换.当然,在wifi_item.xml中,您有两个从ImageView到自定义WifiImageView的更改.

关于Android ICS上的ACCESS_NETWORK_STATE权限android accessibilityservice的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于(OK) Android devices don''t know route to a host located in the same network、Android Browser学习十四 NetworkStateHandler网络状态监听和处理、Android NDK – 构建TessTwo(适用于Android的Tesseract工具的分支) – ndk-build失败、android – ACTION_PICK_WIFI_NETWORK在具有可用网络的对话框上等相关知识的信息别忘了在本站进行查找喔。

本文标签: