Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';在android的ExternalStoragePublicDirectory中找不到创建的文件_Android_Sensors_Bufferedwriter - Fatal编程技术网

Can';在android的ExternalStoragePublicDirectory中找不到创建的文件

Can';在android的ExternalStoragePublicDirectory中找不到创建的文件,android,sensors,bufferedwriter,Android,Sensors,Bufferedwriter,我正在开发一个应用程序,它可以记录智能手机的加速度数据,并在每次单击开始录制按钮时将其保存到文件中, 但是我找不到创建的文件,尽管没有引发异常 我在清单文件中添加了权限请求,并检查了之前提出的与此主题相关的问题,但仍然找不到问题所在 代码如下: public class MainActivity extends AppCompatActivity implements SensorEventListener { int clicknumber = 0; private stat

我正在开发一个应用程序,它可以记录智能手机的加速度数据,并在每次单击开始录制按钮时将其保存到文件中, 但是我找不到创建的文件,尽管没有引发异常

我在清单文件中添加了权限请求
,并检查了之前提出的与此主题相关的问题,但仍然找不到问题所在

代码如下:

public class MainActivity extends AppCompatActivity implements SensorEventListener {

    int clicknumber = 0;
    private static final String LOG_TAG ="";
    private SensorManager mSensorManager;
    private Sensor mAccelerometer;
    private Button mstartButton= null;
    private boolean servicestatus = false;
    private RelativeLayout Rl = null;
    private LinearLayout ll= null;
    long timeOffsetMs= System.currentTimeMillis()-System.nanoTime() / 1000000;

    File file=null;
    BufferedWriter out = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        final String path = Environment.getExternalStoragePublicDirectory
                (Environment.DIRECTORY_DOCUMENTS).getPath();

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        servicestatus = isMyServiceRunning(RecordService.class);
        mstartButton = (Button) findViewById(R.id.recordButton);
        mstartButton.setText("Start Recording");
        mstartButton.setTextColor(Color.GREEN);
        Rl= (RelativeLayout) findViewById(R.id.Rlayout);
        ll = new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        Rl.addView(ll);
        final Intent service = new Intent(this, RecordService.class);
        mstartButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clicknumber+=1;
                if (clicknumber % 2 != 0 || clicknumber == 0  ){
                    startService(service);
                    mstartButton.setText("Stop Recording");
                    mstartButton.setTextColor(Color.RED);
                    String newpath = path +"data.txt";
                    file = new File(newpath);

                }
                else{
                    stopService(service);
                    mstartButton.setText("Start Recording");
                    mstartButton.setTextColor(Color.GREEN);
                }
      }
        });
    }
    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);

    }
    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(this);

    }
    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {

        Sensor mySensor=sensorEvent.sensor;
        if (mySensor.getType()==Sensor.TYPE_ACCELEROMETER){
            float x=sensorEvent.values[0];
            float y=sensorEvent.values[1];
            float z=sensorEvent.values[2];
            long  timestamp=timeOffsetMs+ sensorEvent.timestamp / 1000000;
            if (isMyServiceRunning(RecordService.class) == true){
                TextView tv = new TextView(this);
                tv.setTextColor(Color.WHITE);
                tv.setText(String.format("t=%d,x=%.1f,y=%.1f,z=%.1f", timestamp,x,y,z));
                ll.addView(tv);
                try
                {
                    BufferedWriter out = new BufferedWriter(new FileWriter(file));
                    out.write(Float.toString(x) + Float.toString(y) +
                            Float.toString(z) );
                    out.close();
                }
                catch (IOException e)
                {
                    Log.e(MainActivity.LOG_TAG ,"Exception");
                }


            }
        }
    }
    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {}



    private boolean isMyServiceRunning(Class<?> serviceClass) {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service :
                manager.getRunningServices(Integer.MAX_VALUE)) {
            if (serviceClass.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }
}
public类MainActivity扩展AppCompatActivity实现SensorEventListener{
int clicknumber=0;
私有静态最终字符串LOG_TAG=“”;
私人传感器管理器;
专用传感器mAccelerometer;
私有按钮mstartButton=null;
私有布尔servicestatus=false;
私有RelativeLayout Rl=null;
private LinearLayout ll=null;
long-timeOffsetMs=System.currentTimeMillis()-System.nanoTime()/1000000;
File=null;
BufferedWriter out=null;
@凌驾
创建时的公共void(Bundle savedInstanceState){
最终字符串路径=Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_DOCUMENTS).getPath();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
msSensorManager=(SensorManager)getSystemService(传感器服务);
mAccelerometer=msSensorManager.getDefaultSensor(传感器类型\加速计);
servicestatus=isMyServiceRunning(RecordService.class);
mstartButton=(按钮)findViewById(R.id.recordButton);
mstartButton.setText(“开始录制”);
mstartButton.setTextColor(Color.GREEN);
Rl=(RelativeLayout)findViewById(R.id.Rlayout);
ll=新的线性布局(本);
ll.设置方向(线性布局、垂直);
Rl.addView(ll);
最终意图服务=新意图(此,RecordService.class);
mstartButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
单击数字+=1;
如果(单击编号%2!=0 | |单击编号==0){
startService(服务);
mstartButton.setText(“停止录制”);
mstartButton.setTextColor(Color.RED);
字符串newpath=path+“data.txt”;
文件=新文件(newpath);
}
否则{
停止服务(服务);
mstartButton.setText(“开始录制”);
mstartButton.setTextColor(Color.GREEN);
}
}
});
}
受保护的void onResume(){
super.onResume();
msSensorManager.registerListener(此、mAccelerometer、SensorManager.SENSOR\u DELAY\u UI);
}
受保护的void onPause(){
super.onPause();
mSensorManager.unregisterListener(此);
}
@凌驾
传感器更改时的公共无效(传感器事件传感器事件){
传感器mySensor=sensorEvent.Sensor;
if(mySensor.getType()==Sensor.TYPE\u加速计){
浮点x=传感器事件。值[0];
浮动y=传感器事件值[1];
浮动z=传感器事件值[2];
长时间戳=timeOffsetMs+sensorEvent.timestamp/1000000;
if(isMyServiceRunning(RecordService.class)==true){
TextView tv=新的TextView(此);
电视.彩色(彩色.白色);
tv.setText(String.format(“t=%d,x=%.1f,y=%.1f,z=%.1f”,时间戳,x,y,z));
ll.addView(电视);;
尝试
{
BufferedWriter out=新的BufferedWriter(新的文件写入程序(文件));
out.write(Float.toString(x)+Float.toString(y)+
Float.toString(z));
out.close();
}
捕获(IOE异常)
{
Log.e(MainActivity.Log_标记,“异常”);
}
}
}
}
@凌驾
精度更改时的公共无效(传感器,int i){
专用布尔值isMyServiceRunning(类serviceClass){
ActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_服务);
对于(ActivityManager.RunningServiceInfo服务:
manager.getRunningServices(Integer.MAX_值)){
if(serviceClass.getName().equals(service.service.getClassName())){
返回true;
}
}
返回false;
}
}

提前谢谢

您的文件位于:
/storage/emulated/0/Documentsdata.txt

请注意,应该满足两个条件,因为这里的错误不是故意的

  • 目录文档必须存在
  • 您忘记了下一行中的
    /

    错误:字符串newpath=path+“data.txt” 无错误:字符串newpath=path+“/”+“data.txt”
  • 如果您现在测试您的代码,您可以得到您的文件或引发异常


    您使用的是哪种api?。必须在清单中声明将文件写入存储的权限。但是对于完整性,如果系统api>23,您应该授予用户权限。

    感谢您的帮助,我更正了错误(“/”),但问题仍然存在。我还确保目录文档存在。问题已解决,谢谢,系统api为25,因此我从
    Settings>apps
    为应用程序授予了存储权限。。!