小编Chu*_*ham的帖子

从Android L及更高版本开始,setMobileDataEnabled方法不再可调用

我已经向Google报告了问题78084,因为该setMobileDataEnabled()方法不再可以通过反射调用.它可以通过反射从Android 2.1(API 7)到Android 4.4(API 19)进行调用,但是从Android L及更高版本开始,即使使用root,该setMobileDataEnabled()方法也不可调用.

官方回应是问题是"已关闭",状态设置为"WorkingAsIntended".谷歌的简单解释是:

私有API是私有的,因为它们不稳定,可能会在没有通知的情况下消失.

是的,谷歌,我们意识到使用反射调用隐藏方法的风险 - 甚至在Android出现之前 - 但是你需要提供一个更加可靠的答案,如果有的话,可以实现相同的结果setMobileDataEnabled().(如果您对Google的决定不满意,请登录问题78084,并尽可能多地将其加注,以便让Google知道他们的错误.)

所以,我的问题是:在Android设备上以编程方式启用或禁用移动网络功能时,我们是否处于死胡同?谷歌的这种严厉的方法在某种程度上并不适合我.如果您有Android 5.0(Lollipop)及其他方法的解决方法,我很乐意听到您在此主题中的回答/讨论.

我使用下面的代码来查看该setMobileDataEnabled()方法是否可用:

final Class<?> conmanClass = Class.forName(context.getSystemService(Context.CONNECTIVITY_SERVICE).getClass().getName());
final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField.get(context.getSystemService(Context.CONNECTIVITY_SERVICE));
final Class<?> iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
final Method[] methods = iConnectivityManagerClass.getDeclaredMethods();
for (final Method method : methods) {
    if (method.toGenericString().contains("set")) {
        Log.i("TESTING", "Method: " + method.getName());
    }
}
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.

更新:目前,如果设备已植根,则可以切换移动网络.但是,对于非根设备,它仍然是一个调查过程,因为没有通用的方法来切换移动网络.

reflection android android-5.0-lollipop

47
推荐指数
3
解决办法
4万
查看次数

EditText会自动转到新行

我想EditText使用2的最大行数和最大长度为20.如果EditText长度大于10,它应该自动转到新行,这样用户就不需要按Enter键.有人可以帮我解决这个问题吗?

android android-edittext

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

如何以编程方式检查Android中蓝牙设备的连接状态?

我可以枚举配对Bluetooth设备,我需要在应用启动时检查它们当前的连接状态.

但是,我发现无法获得连接状态?!

以下是我尝试但失败的一些努力:

  1. android.bluetooth.BluetoothDevice

它有获得远程设备的键状态的方法,和用于键状态可能值如下:BOND_NONE,BOND_BONDING,BOND_BONDED.但这不是连接状态.

  1. android.bluetooth.BluetoothProfile

该方法可用于获取连接状态,但BluetoothProfile必须首先获取对象.

public abstract int getConnectionState (BluetoothDevice device); 
Run Code Online (Sandbox Code Playgroud)

正如在doc中描述的那样:" 客户端应调用getProfileProxy(Context,BluetoothProfile.ServiceListener,int),以获取配置文件代理. ",它只能ServiceListener在状态发生变化时在被调用时进行检索.

如果我在启动时查询状态而没有发生任何状态更改,该怎么办?

  1. android.bluetooth.BluetoothManager

它提供了一种方法:

public int getConnectionState (BluetoothDevice device, int profile);
Run Code Online (Sandbox Code Playgroud)

但是它不能被用于检测连接状态的的Bluetooth扬声器,作为配置文件参数只接受GATTGATT_SERVER(用于低能量设备),其他轮廓(HEADSET,HEALTH,A2DP)不被支持.

  1. android.bluetooth.BluetoothAdapter

它提供了一种方法:

public int getProfileConnectionState (int profile);
Run Code Online (Sandbox Code Playgroud)

此功能可用于检查本地Bluetooth适配器是否连接到特定配置文件的任何远程设备.它可用于检查指定的配置文件.但它不能用于检查给定的设备.

有谁知道如何获得给定Bluetooth设备的连接状态?

提前致谢.

android bluetooth

10
推荐指数
1
解决办法
5425
查看次数

注意:android.support.v4.text.ICUCompatIcs:找不到动态引用的类libcore.icu.ICU

我今天开始使用最新的Android Build Tools(ABT)v19.0.3获取消息.乍一看,我认为这可能是ABT的一个问题.但是,仔细研究发现这条消息:

android.support.v4.text.ICUCompatIcs: can't find dynamically referenced class libcore.icu.ICU
Run Code Online (Sandbox Code Playgroud)

仅在使用Proguard时显示.网上的答案对我来说没有解决方案.也许,这只是Proguard的问题(我使用的版本与Android SDK v22.3捆绑在一起).

我已将以下指令添加到proguard-project.txt文件中,但它没有区别:

-keep interface android.support.v4.** { *; }
-keep class android.support.v4.** { *; }
Run Code Online (Sandbox Code Playgroud)

有没有其他人遇到此消息并有可能的解决方案?也许来自Proguard的Eric可能会对这个问题有所了解.也许Proguard需要清理代码?我很想知道解决方案.

android proguard

8
推荐指数
1
解决办法
2560
查看次数

使用p:dataTable进行行编号

我有这个问题:

SELECT @rownum:=@rownum+1 'no', m.title, m.author, REPLACE(SUBSTRING_INDEX(m.content, ' ', 20), '<br>', ' '), m.viewed, m.hashid FROM book m, (SELECT @rownum:=0) r WHERE m.lang = ?1 AND m.title like CONCAT('%',?2,'%') ORDER BY m.title asc
Run Code Online (Sandbox Code Playgroud)

@rownum:=@rownum+1MySQL的查询结果编号第Primefaces的一部分,目前没有一个设施,以显示一个编号列.

有没有办法显示Primefaces列编号而不必这样做@rownum:=@rownum+1

如果没有,我可以使用纯粹的CriteriaBuilder方法构造上述查询吗?

mysql primefaces jsf-2 jpa-2.0

7
推荐指数
1
解决办法
2万
查看次数

Android反射方法错误

我试图用这个Android类找出Reflection:

Class<?> c = Class.forName("com.android.internal.widget.LockPatternUtils");
Method method = c.getDeclaredMethod("getKeyguardStoredPasswordQuality");
method.setAccessible(true);
Object object = method.invoke(c); // Error with this line
result = object.toString());
Run Code Online (Sandbox Code Playgroud)

该方法getKeyguardStoredPasswordQuality声明为(无参数):

public int getKeyguardStoredPasswordQuality() {
    // codes here
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

Exception: java.lang.IllegalArgumentException: expected receiver of type com.android.internal.widget.LockPatternUtils, but got java.lang.Class<com.android.internal.widget.LockPatternUtils>
Run Code Online (Sandbox Code Playgroud)

我如何申报com.android.internal.widget.LockPatternUtils接收者?

java reflection android

6
推荐指数
1
解决办法
7465
查看次数

更新的Android SDK和Android Studio搞砸了我的所有XML:"此处不允许使用元素XXX"

我刚刚更新了我的Android Studio和Android SDK,现在我无法在我的XML中做任何事情.它显示了与之前相同的东西,但我无法添加任何东西,而且有些东西搞砸了.

例:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <ImageView
        android:id="@+id/bocterAppLogo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/bocterapp"
        android:contentDescription=""/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

它错误地说:"这里不允许使用Element ImageView".

你知道为什么会这样吗?

干杯!

xml android

6
推荐指数
1
解决办法
3755
查看次数

JSF2和Facelets - java.io.FileNotFoundException

我的JSF 2项目结构如下:

root
...
   WebContent
      META-INF
      resources
         css
         images
         javascript
   templates
      commonLayout.xhtml
      footer.xhtml
      header.xhtml  
   views
      main
         index.xhtml
   WEB-INF
   index.jsp
Run Code Online (Sandbox Code Playgroud)

当我尝试在http://localhost/home/main/index.jsf查看我的页面时遇到此错误:

java.io.FileNotFoundException
at org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:381)
at com.sun.faces.facelets.impl.DefaultFaceletCache._getLastModified(DefaultFaceletCache.java:161)
at com.sun.faces.facelets.impl.DefaultFaceletCache.access$000(DefaultFaceletCache.java:62)
at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:82)
at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:79)
at com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:99)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:114)
at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:119)
at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:62)
at com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:248)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:366)
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:346)
at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199)
at com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:155)
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93)
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:82)
at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:744)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at …
Run Code Online (Sandbox Code Playgroud)

facelets jsf-2

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

@ManagedProperty - 将一个请求范围的bean注入另一个请求范围的bean

我有这个SearchBean:

@ManagedBean(name = "searchBean")
@RequestScoped
public class SearchBean implements Serializable
{
    private String input = null;

    // getter methods
    public String getInput() {
        return input;
    }

    // setter method
    public void setInput(String input) {
        this.input = input;
    }

    public String Submit() {
        return null;
    }    
}
Run Code Online (Sandbox Code Playgroud)

我可以使用@ManagedProperty将其注入另一个bean.例如:

@ManagedBean(name = "bookBean")
@RequestScoped
public class BookBean implements Serializable
{
    @ManagedProperty(value = "#{searchBean}")
    private SearchBean searchBean;  

    @PostConstruct
    public void init()
    {   
       System.out.println("Value: " + searchBean.getInput());
    }

    public SearchBean getSearchBean() {
       return …
Run Code Online (Sandbox Code Playgroud)

jsf code-injection jsf-2

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

如何从状态栏检测方向更改

在状态栏下,有五个按钮 - Wifi,蓝牙,GPS,静音模式和自动旋转.我还没有找到一种方法来检测用户何时单击"自动旋转"按钮.

我所做的是有一个服务,倾听方向的变化,如:

public class MyService extends Service {

    @Override
    public void onCreate() {
       super.onCreate();
       IntentFilter intentFilter = new IntentFilter();
       intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
       this.registerReceiver(myReceiver, intentFilter);     
    }

    public BroadcastReceiver myReceiver = new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
          if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
             // Show a message about orientation changes.
             // This method is only called when the phone is physically rotated.
          }
       }
    }  
}
Run Code Online (Sandbox Code Playgroud)

上述BroadcastReceiver仅在手机旋转时才有效,但如果单击"自动旋转"按钮而没有手机的任何物理旋转,则永远不会调用BroadcastReceiver方法.

我也尝试过OrientationEventListener - 但是与BroadcastReceiver方法的行为相同.

要设置方向,我使用以下方法:

Settings.System.getInt(context.getContentResolver(), "accelerometer_rotation")
Run Code Online (Sandbox Code Playgroud)

所以我知道有一种询问系统设置的方法.是否存在陷阱系统设置的[方向]更改?我已经浏览了Android文档,但找不到一个 - 也许,我正在寻找错误的地方,或者没有意图.

有没有人知道如何捕获状态栏中自动旋转按钮的更改?

更新1:我正在使用的设备是:三星Galaxy S3,三星Galaxy …

android listener orientation broadcastreceiver android-intent

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

Glassfish 3 - 从静态服务器加载图像

我正在尝试从部署到Glassfish v3的 Web应用程序之外的服务器加载图像(和其他静态内容).我在web.xml中有以下配置,但它不适用于Glassfish(但它适用于Tomcat):

<servlet>
    <servlet-name>ExternalImagesServlet</servlet-name>
    <servlet-class>com.example.servlet.HttpProxyServlet</servlet-class>
    <init-param>
        <param-name>RemoteURI</param-name>
        <param-value>http://ip.of.second.server/website-files</param-value>
    </init-param>   
    <init-param>
        <param-name>AllowedContentTypes</param-name>
        <param-value>image/gif,image/jpeg,image/png</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>ExternalImagesServlet</servlet-name>
    <url-pattern>/images/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

其中ip.of.second.server是服务器的实际IP地址.我有一个名为website-files.xml的文件定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="d:/internet/website/images" />
Run Code Online (Sandbox Code Playgroud)

并将website-files.xml保存到glassfish\domains\domain1\config目录.但是Glassfish没有拿起这个配置文件.

我看过Oracle Glassfish配置doco,但没有提到如何从不同的服务器引用图像.

请帮忙.

glassfish-3

2
推荐指数
1
解决办法
4127
查看次数

#{param}上的@ManagedProperty在@ViewScoped中不起作用

我的豆有这个:

@ManagedBean
@ViewScoped
public class BookBean implements Serializable
{       
    @ManagedProperty(value = "#{param.id}") // does not work with @ViewScoped
    private String id;

    public void init()
    {
        id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")
        if (id != null) {
            System.out.println("ID: " + id);
            currentBook = bookService.find(id);
        }
    }

    @PostConstruct
    public void post()
    {   
        // does not work with @ViewScoped
        System.out.println("ID: " + id);
        currentBook = bookService.find(id);    
    }

    public String getId() {
        return id;
    } 

    public void setId(String id) {
       this.id = id;
    }
}
Run Code Online (Sandbox Code Playgroud)

目的地Facelet有这个:

<f:metadata> …
Run Code Online (Sandbox Code Playgroud)

jsf jsf-2 http-request-parameters view-scope

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