如何在安卓设备上检测屏幕压力?

3

我想获取屏幕的压力。当运行显示消息“很抱歉,应用程序已停止”的应用程序时,我有另一个问题:当获取屏幕的压力时,是否可以通过某种数学或物理方式将其转换为重量(克)?以下是我拥有的代码:

编辑:我在平板电脑上运行此应用程序

package com.realscale.stefanrafa;

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MotionEvent;
    import android.widget.TextView;

    public class MainActivity extends Activity {

        TextView textinfo;
        MotionEvent pressure;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textinfo = (TextView) findViewById(R.id.Information);

            float press = pressure.getPressure();
            textinfo.setText("Scale: " + (int) press);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }

    }

错误日志:

08-30 19:53:40.620: W/ActivityThread(29458): Application com.realscale.stefanrafa can be debugged on port 8100... 08-30 19:53:40.710: D/AndroidRuntime(29458): Shutting down VM 08-30 19:53:40.710: W/dalvikvm(29458): threadid=1: thread exiting with uncaught exception (group=0x41a0c2a0) 
08-30 19:53:40.715: E/AndroidRuntime(29458): FATAL EXCEPTION: main 08-30 19:53:40.715: E/AndroidRuntime(29458): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.realscale.stefanrafa/com.realscale.stefanrafa.MainActivity}: java.lang.NullPointerException 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)        
08-30 19:53:40.715: E/AndroidRuntime(29458):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at android.app.ActivityThread.access$700(ActivityThread.java:140) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at android.os.Handler.dispatchMessage(Handler.java:99) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at android.os.Looper.loop(Looper.java:137) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at android.app.ActivityThread.main(ActivityThread.java:4921) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at java.lang.reflect.Method.invokeNative(Native Method) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at java.lang.reflect.Method.invoke(Method.java:511) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 08-30 19:53:40.715: E/AndroidRuntime(29458):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at dalvik.system.NativeStart.main(Native Method) 

08-30 19:53:40.715: E/AndroidRuntime(29458): Caused by: java.lang.NullPointerException 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at com.realscale.stefanrafa.MainActivity.onCreate(MainActivity.java:19) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at android.app.Activity.performCreate(Activity.java:5188) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 

08-30 19:53:40.715: E/AndroidRuntime(29458):    ... 11 more

不确定你的问题是什么,你是在寻求物理方面的帮助还是你的应用程序出现了异常? - D-Dᴙum
是的,我的应用程序抛出了一个异常,我认为是因为代码的问题,并且还想询问一下如何将屏幕压力转换为克。 - Stefan
您需要发布logcat的输出以查看异常被抛出的位置,以及与异常相关的所有代码。 - D-Dᴙum
E/AndroidRuntime(29458): 在com.realscale.stefanrafa.MainActivity.onCreate(MainActivity.java:19)处发生错误。MainActivity()的第19行是什么? - D-Dᴙum
已更新整个脚本... - Stefan
显示剩余3条评论
1个回答

9
压力是一个介于0到1之间的浮点数。它的意义取决于硬件。即使有硬件压力传感器,实际力量和getPressure()返回值之间的映射仍然取决于设备。此外,一些没有硬件压力传感器的设备会从触摸点的大小模拟压力,也就是说,它们假定更多的压力意味着你的手指扁平化。其他设备只返回一个固定值。
此外,力或重量(以牛顿为单位)与质量(以克为单位)不同。请参阅http://en.wikipedia.org/wiki/Mass_versus_weight
如果您想获得关于异常的帮助,则应发布源代码和抛出异常的行。 adb log能给你帮助。
编辑:
你使用未初始化的pressure。它只是被声明但未设置为任何值,因此它是null。只有视图(小部件)可以接收MotionEvent。您需要对您的活动进行一些操作(例如填充布局),然后将触摸侦听器设置为布局中一个视图的监听器:
someView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        float pressure = event.getPressure();
    }
});

这段代码实际上是可以工作的,但仅当您用手指按下时才有效。如果可能的话,我想禁用它,以便从所有对象获取压力。顺便说一句,我知道这是由于触摸引起的,只是想知道是否可以禁用它? - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接