2017-01-13 16:29:00 weixin_42793441 阅读数 255
  • 如何使用Spring XD构建Data Microservices

    在Pivotalk第一期公开课中,我们介绍了SpringBoot和Cloud的微服务框架,帮助开发者构建云端微服务。在这一期公开课中,我们将看到如何使用Spring Cloud Data Flow来进一步的增强云端微服务应用进行多种交互协议,以及海量数据的处理能力。

    4778 人正在学习 去看看 CSDN讲师

我们调试 App 的时候有时候要去除应用下 data/data/ 的文件,之前我都是运行在虚拟机上,然后再取出数据。今天发现一个好的方法,可以在真机上(不用 root )直接去除 data/data/ 下的数据。

  • 首先打开 Android studio 的 Terminal 界面,或者打开命令行,切换到项目的目录下;
  • 然后依次执行下面的命令

$ adb shell #执行adb shell命令连接手机设备

$ run-as com.packagename #执行run-as命令切换当前用户,这里输入你应用的包名

$ pwd #定位当前文件位置

$ ls #查看当前文件夹下的文件

$ cat databases/xx.db > /sdcard/xx.db #使用cat命令导出需要的文件(xx.db)到sd卡

然后你就可以看到你需要的文件输出到手机的 sdcard 指定位置,移动到电脑,就可以查看了。

2013-09-05 23:39:51 hy295683872 阅读数 977
  • 如何使用Spring XD构建Data Microservices

    在Pivotalk第一期公开课中,我们介绍了SpringBoot和Cloud的微服务框架,帮助开发者构建云端微服务。在这一期公开课中,我们将看到如何使用Spring Cloud Data Flow来进一步的增强云端微服务应用进行多种交互协议,以及海量数据的处理能力。

    4778 人正在学习 去看看 CSDN讲师

下面简单介绍一下,我的方法,可能有点笨拙。

我主要用的是Context.openFileOutput()和Context.openFileInput()方法。

测试部分,被用到的应用先存入一个文件,做好被调用准备。代码如下:

    //定义文件的名称  
    String oldfileName = "/data/data/com.data.datatest/files/hy.txt";  

    //写入和读出的数据信息  
    String message = "来,战个痛快!";  
    TextView test;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        test = (TextView) findViewById(R.id.testTextview);
        File aFile = new File(oldfileName);
        writeDatabaseFile(aFile, message);
        test.setText(message);
    }
    
    public void writeDatabaseFile(File fileName,String fileContext){
    	try {
    		Log.e("1111", "fileName.getName()= "+fileName.getName());		//设置文件权限
    		FileOutputStream fileOutputStream = openFileOutput("hh.txt",
    				Context.MODE_WORLD_READABLE+ Context.MODE_WORLD_WRITEABLE);
			byte[] temBytes = fileContext.getBytes();
			fileOutputStream.write(temBytes);
			fileOutputStream.close(); 
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
    }

至此在应用程序里的/data/data/包名/files/路径下有个hh.txt文件了。权限为


下面为调用该文件的应用代码:

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		try {
			Context c = createPackageContext("com.data.datatest",
					Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
			readFileData(c);
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		setContentView(R.layout.activity_main);
		TextView aTextView = (TextView) findViewById(R.id.useText);
		aTextView.setText(result);
	}
	
	// 打开指定文件,读取其数据,返回字符串对象
	public String readFileData(Context tempContext) {
		try {
			FileInputStream fin = tempContext.openFileInput("hh.txt");
			FileOutputStream outputStream = openFileOutput("hy.txt",
					Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
			int lenght = fin.available(); // 获取文件长度
			byte[] buffer = new byte[lenght];
			int c;
			while ((c = fin.read(buffer)) > 0) {
				outputStream.write(buffer, 0, c);
			}
			fin.close();
			outputStream.close();
			// 将byte数组转换成指定格式的字符串
			result = EncodingUtils.getString(buffer, ENCODING);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

Context c = createPackageContext("com.data.datatest",Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);

Context有个createPackageContext方法,可以创建另外一个包的上下文,这个实例不同于它本身的Context实例,但是功能是一样的。

这个方法有两个参数:

1. packageName 包名,要得到的应用的包名

2. flags 标志位,有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY两个选项。CONTEXT_INCLUDE_CODE的意思是包括代码,即可以执行这个包里面的代码。CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加这个歌标志位的话,有些功能就用不了的,会出现安全警告。

代码里将Context  c 作为参数传入readFileData里面,由于Context 有openFileInput函数,通过这个函数就可以直接得到你想得到的应用程序包里面的Files文件夹下的文件,而这里的openFileOutput("hy.txt",Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);则是在自己应用里建立hy.txt文件,然后通过输入流写进输出流,就实现了拷贝别的应用里的文件到自己的应用里。


接下来就是写别的应用里的数据,方法类似,主要是context的使用。

	public void writeFileAndSave(Context tempContext) throws IOException{
		String testStr = "美得不得了";
		FileOutputStream outputStream = tempContext.openFileOutput("hh.txt",
				Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
		byte[] buffer = testStr.getBytes();
		outputStream.write(buffer);
		outputStream.close();
	}

各应用之间数据读写主要是context的使用。另外,应用中的cache,files的权限是一样的。都能互相访问,但是如果是自己创建的文件夹则只有被自己应用调用的权限。

另外一种方法,比较简单:就是设置文件夹和文件权限。

网上有可以修改自己建的文件夹和文件的权限,我又测试了一下,发现也能实现,被调用的程序包的文件,设置权限:

    public void initChmodDir(){
		File destDir = new File("/data/data/com.data.datatest/test/mmp.txt");
		if (!destDir.exists()) {
			destDir.getParentFile().mkdirs();
		}
		writeDatabaseFile(destDir, "你比大S多个B,大SB!");
		Process p;
		int status = -1;
		try {
			p = Runtime.getRuntime().exec("chmod 777 " + destDir);
			p = Runtime.getRuntime().exec("chmod 777 " + destDir.getParentFile());
			status = p.waitFor();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (status == 0) {    
			//chmod succeed   
		    Toast.makeText(this, "chmod succeed", Toast.LENGTH_LONG).show();
		} else {    
			//chmod failed 
			Toast.makeText(this, "chmod failed", Toast.LENGTH_LONG).show();
		}
    }
    public void writeDatabaseFile(File fileName,String fileContext){
    	try {
    		Log.e("1111", "fileName.getName()= "+fileName.getName());
    		FileOutputStream fileOutputStream = new FileOutputStream(fileName);
//    		FileOutputStream fileOutputStream = openFileOutput("hh.txt",
//    				Context.MODE_WORLD_READABLE+ Context.MODE_WORLD_WRITEABLE);
			byte[] temBytes = fileContext.getBytes();
			fileOutputStream.write(temBytes);
			fileOutputStream.close(); 
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
    }

然后是调用者部分:

	public String readTestFileData(Context tempContext) {
		File oldFile = new File("/data/data/com.data.datatest/test/mmp.txt");
		if (oldFile.exists()) {
			File newfile = new File("/data/data/com.usedata.usefile/huyi/hy.txt");
			if (!newfile.exists()) {
				newfile.getParentFile().mkdirs();
			}
			writeDatabaseFile(newfile, oldFile);
		}
		return result;
	}
	
	public void writeDatabaseFile(File fileName,File oldFile){
    	try {
    		FileInputStream inputStream = new FileInputStream(oldFile);
    		FileOutputStream fileOutputStream = new FileOutputStream(fileName);
    		int lenght = inputStream.available(); // 获取文件长度
			byte[] buffer = new byte[lenght];
			int c;
			while ((c = inputStream.read(buffer)) > 0) {
				fileOutputStream.write(buffer, 0, c);
			}
			fileOutputStream.close(); 
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
    }

前后截图为:



验证过后发现权限确实改了,而且文件也复制过来了,包括文件内容。

总结,如果用openFileInput或者openFileOutput就需要获取被调用的context。如果不用就需要修改被调用文件夹和文件的权限。



2018-08-07 17:13:00 jiabailong 阅读数 1297
  • 如何使用Spring XD构建Data Microservices

    在Pivotalk第一期公开课中,我们介绍了SpringBoot和Cloud的微服务框架,帮助开发者构建云端微服务。在这一期公开课中,我们将看到如何使用Spring Cloud Data Flow来进一步的增强云端微服务应用进行多种交互协议,以及海量数据的处理能力。

    4778 人正在学习 去看看 CSDN讲师

获取Android/data/目录

通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据,卸载时会跟随卸载

posted @ 2018-08-07 17:13 清澈见底 阅读(...) 评论(...) 编辑 收藏
2014-10-28 10:55:49 Value_Liu 阅读数 9741
  • 如何使用Spring XD构建Data Microservices

    在Pivotalk第一期公开课中,我们介绍了SpringBoot和Cloud的微服务框架,帮助开发者构建云端微服务。在这一期公开课中,我们将看到如何使用Spring Cloud Data Flow来进一步的增强云端微服务应用进行多种交互协议,以及海量数据的处理能力。

    4778 人正在学习 去看看 CSDN讲师

// 需在源码下编译

// 实现。。。
	private ClearUserDataObserver mClearDataObserver;
    class ClearUserDataObserver extends IPackageDataObserver.Stub {
        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
            /*final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
            msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
            mHandler.sendMessage(msg);*/
         }
     }
    
    /*
     * Private method to initiate clearing user data when the user clicks the clear data 
     * button for a system package
     */
    private  void initiateClearUserData(String packageName) {
        // Invoke uninstall or clear user data based on sysPackage
        Log.i("type1", "Clearing user data for package : " + packageName);
        if (mClearDataObserver == null) {
            mClearDataObserver = new ClearUserDataObserver();
        }
        ActivityManager am = (ActivityManager) MainActivity.this.getSystemService(Context.ACTIVITY_SERVICE);
        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
        if (!res) {
            // Clearing data failed for some obscure reason. Just log error for now
            Log.i("type1", "Couldnt clear application user data for package:"+packageName);
            
        } else {
        	// success
        	 Log.i("type1", "success");
        }
    }

// 调用。。。
			// 清楚用户数据
			initiateClearUserData("com.set.time");



                                
2016-02-23 16:42:08 wxlinwzl 阅读数 4620
  • 如何使用Spring XD构建Data Microservices

    在Pivotalk第一期公开课中,我们介绍了SpringBoot和Cloud的微服务框架,帮助开发者构建云端微服务。在这一期公开课中,我们将看到如何使用Spring Cloud Data Flow来进一步的增强云端微服务应用进行多种交互协议,以及海量数据的处理能力。

    4778 人正在学习 去看看 CSDN讲师

 

       本文重点展示,对/data/data/<package name>/files中文件的读写操作的实现。

       一、写出数据到files文件夹中,Activity提供了openFileOutput()方法,可以把数据输出到/data/data/<package name>/files的文件夹中。

[java] view plain copy
  1. public class FileActivity extends Activity {  
  2.     @Override   
  3.   
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         ...   
  6.     FileOutputStream outStream = this.openFileOutput("itcast.txt", Context.MODE_PRIVATE);  
  7.         outStream.write("测试".getBytes());  
  8.         outStream.close();     
  9.     }  
  10. }  


      第一个参数:指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 自动创建它。保存在/data/data/<package name>/files目录中,如: /data/data/cn.itcast.action/files/ceshi.txt 。
      第二参数用于指定操作模式,有四种模式,分别为:

[html] view plain copy
  1. Context.MODE_PRIVATE  
  2.        Context.MODE_APPEND  
  3.        Context.MODE_WORLD_READABLE  
  4.        Context.MODE_WORLD_WRITEABLE  

     可以同时传入一种以上的模式如:

[html] view plain copy
  1. openFileOutput("ceshi.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);  


二、读取 /data/data/<package name>/files/ceshi.txt中的数据。直接上代码:

[html] view plain copy
  1. FileInputStream inStream = context.openFileInput(ceshi.txt);//只需传文件名  
  2.     ByteArrayOutputStream outStream = new ByteArrayOutputStream();//输出到内存  
  3.       
  4.     int len=0;  
  5.     byte[] buffer = new byte[1024];  
  6.     while((len=inStream.read(buffer))!=-1){  
  7.         outStream.write(buffer, 0, len);//  
  8.     }  
  9.       
  10.     byte[] content_byte = outStream.toByteArray();  
  11.     String content = new String(content_byte);  
  12.     system.out.println(content)  

总结:重点注意的地方就是openFileOutput()的第一个参数和openFileInput()的参数,不需要写绝对路径,只需写文件名就可以了!

 

附言:当然读取数据时也可以用绝对路径,没有本文所述的方便,比如读取文件时可以用:

[java] view plain copy
  1. Context context=MainActivity.this;//首先,在Activity里获取context    
  2. File file=context.getFilesDir();    
  3. String path=file.getAbsolutePath();   
  4. System.out.println(path);  
  5.           
  6. File file = new File(path+ceshi.txt);  
  7. FileInputStream inStream = new FileInputStream(file);//需传路径: /data/data/cn.itheima.rw_file/files/ceshi.txt  

上边几行的代码的作用仅仅相当于下边这一句代码的作用:

[java] view plain copy
  1. context.openFileInput("ceshi.txt";  




没有更多推荐了,返回首页