编辑2:应用程序如何检测属于它的SD卡上的文件夹或文件?

时间:2013-10-22 11:48:32

标签: android directory sharedpreferences

我正在创建一个目录来放置我的应用程序创建的音频文件。该目录位于SD卡上。

但如果人们手动修改SD卡上的该文件夹,那么我的应用程序如何检测该事件并重命名路径以将音频保存在应用程序中?或者如果文件夹被删除也可以检测到吗?

另一个问题:

假设在SD卡上的特殊文件夹中创建的音频文件列在ListView中。 (Application.onCreate自动列出该特殊文件夹中存在的应用程序创建的所有音频文件。

现在我们从应用程序退出并转到该文件夹​​并复制另一个不是由我的应用程序创建的音频。现在我们再次运行应用程序。复制的音频不得显示为创建的音频文件,因为它实际上不属于我的程序。这可能吗?

我的应用程序如何理解从其他地方到属于我的程序的文件夹的复制音频文件肯定不属于它...

这个想法我每次创建一个音频然后再次在sdcard上列出我文件夹中的所有音频。但这个问题,因为也许人们挑剔或修改(比如将其他音频复制到我的文件夹或重命名或通过剪切或合并修改其中一个音频)现在应用程序如何理解这个事件?你的帮助将会受到赞赏......

更新: 我看了这个链接,发现了这个: 使用共享首选项

SharedPreferences类提供了一个通用框架,允许您保存和检索原始数据类型的持久键值对。您可以使用SharedPreferences保存任何原始数据:布尔值,浮点数,整数,长整数和字符串。这些数据将在用户会话中持续存在(即使您的应用程序被终止)。

用户首选项

共享首选项并非严格用于保存“用户首选项”,例如用户选择的铃声。如果您对为应用程序创建用户首选项感兴趣,请参阅PreferenceActivity,它为您创建用于创建用户首选项的Activity框架,该框架将自动保留(使用共享首选项)。

要获取应用程序的SharedPreferences对象,请使用以下两种方法之一:  •getSharedPreferences() - 如果需要使用第一个参数指定的名称标识的多个首选项文件,请使用此选项。 •getPreferences() - 如果您的Activity只需要一个首选项文件,请使用此选项。因为这将是您的Activity的唯一首选项文件,所以您不提供名称。

To write values: 1.Call edit() to get a SharedPreferences.Editor.
2.Add values with methods such as putBoolean() and putString().
3.Commit the new values with commit()
To read values, use SharedPreferences methods such as getBoolean() and getString().

以下示例在计算器中保存了对静音按键模式的偏好:

 public class Calc extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile";

    @Override
    protected void onCreate(Bundle state){
       super.onCreate(state);
       . . .

       // Restore preferences
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       boolean silent = settings.getBoolean("silentMode", false);
       setSilent(silent);
    }

    @Override
    protected void onStop(){
       super.onStop();

      // We need an Editor object to make preference changes.
      // All objects are from android.context.Context
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
      SharedPreferences.Editor editor = settings.edit();
      editor.putBoolean("silentMode", mSilentMode);

      // Commit the edits!
      editor.commit();
    }
}

并阅读此链接之前提示我。 How can I refresh MediaStore on Android?

但我不能使用这些信息。我需要更多。

编辑2: 你好。 我不认为在SharedPrefrences中保存我的对象可以解决我的问题。 当我的应用程序创建的音频进行更改时(例如名称更改) 然后当应用程序运行时,该dosnt知道变化。我想我的应用程序无法在我的列表中执行这些变化。 不是真的吗? 我写这段代码但是当我录制音频并用prefrences保存它的名字时 我退出应用程序,我更改我的音频,名称,并再次运行我的程序我的音频,名称必须更改 在textview.but中只显示“null”。 我认为使用sharedPrefrences dosnt解决了我的问题。

` import android.app.Activity;

import android.content.SharedPreferences; import android.os.Bundle;

import android.util.Log;

import android.view.MotionEvent;

导入android.view.View;

导入android.widget.Button;

导入android.widget.TextView;

公共类TestSharedActivity扩展了Activity {

 Button btnst=null;

   Button btnsp=null;

    AudioRecorder myAudio=null;

    TextView tv=null;

    String audioName=null;


public static final String PREFS_NAME = "MyPrefsFile";


protected void onCreate(Bundle state)
{
   super.onCreate(state);
   setContentView(R.layout.main);

   btnst=(Button) findViewById(R.id.btnrec);
   btnsp=(Button) findViewById(R.id.btnstop);
   tv=(TextView) findViewById(R.id.textv);

   onTouchListeners();

   // Restore preferences
   SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
  // boolean silent = settings.getBoolean("silentMode", false);
   String name = settings.getString("mname","null");
   setName(name);
}

private void setName(String name)
{
    tv.setText(name);

}

@Override
protected void onStop()
{
   super.onStop();

  // We need an Editor object to make preference changes.
  // All objects are from android.context.Context
  SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
  SharedPreferences.Editor editor = settings.edit();

  editor.putString("mname", audioName);

  // Commit the edits!
  editor.commit();
}
/////////////////////////
private void onTouchListeners()
 {

         View.OnTouchListener startListener=new View.OnTouchListener() 
         {

            public boolean onTouch(View v, MotionEvent event) 
            {
                if (MotionEvent.ACTION_DOWN == event.getAction()) 
                {           

                }
                else if (MotionEvent.ACTION_UP == event.getAction()) 
                {       
                    myAudio=new AudioRecorder();
                    audioName=myAudio.getName();
                    String path=myAudio.getPath();
                    tv.setText(path);

                    try
                    {

                      myAudio.Record();
                    }
                    catch(Exception e)
                    {
                        Log.d("audio recorddddddddd","cant starttt!!!!!!!!!!!!");
                    }

                }
                return true;
            }
         }; 

        ////////////////////////////////////////////////
         View.OnTouchListener stopListener=new View.OnTouchListener() 
         {

            public boolean onTouch(View v, MotionEvent event) 
            {
                if (MotionEvent.ACTION_DOWN == event.getAction()) 
                {               

                }
                else if (MotionEvent.ACTION_UP == event.getAction()) 
                {


                try
                    {
                      myAudio.stopRecord();
                    }
                    catch(Exception e)
                    {
                        Log.d("audio record stoppppppppppp",e.toString());
                    }

                }
                return true;
            }
         }; 

          btnst.setOnTouchListener(startListener);
          btnsp.setOnTouchListener(stopListener);
 }//end ontouch

} ` AudioRecorder是一个用于记录和保存音频到SDcard上的特殊文件夹的类。 和main.xml有2个按钮“记录和停止”和一个文本视图显示名称我的音频和再次运行时显示更改的音频,名称。(如果它需要更改)

2 个答案:

答案 0 :(得分:0)

你必须稍微改变你的逻辑,我认为当你创建一个音频时,你只需将其写入SD卡。为了区分你的声音和其他人的声音(在那个文件夹中),你必须在某处保留一个创建的声音列表

您可以通过各种方式实现这一目标:

  1. SharedPreferences
  2. SQLlite数据库
  3. 以纯文本格式写入SD卡中的其他文本文件(您也可以对其进行加密,移位字节 - 执行某些操作以使文本编辑器或其他人无法读取)
  4. 希望这有帮助

    编辑:

    一种简单的方法是使用您的对象填充列表(包含您需要的所有元数据)并将其序列化为私有文件(或共享首选项中的字符串条目)。通过这种方式,您可以拥有相当多的元数据,但是在将来更改对象结构时可能会遇到问题(当然,如果它发生了变化)。

    请参阅我的其他答案,了解如何做到这一点: What is the most suitable way to store object in android?

答案 1 :(得分:0)

我认为你应该在创建文件夹时隐藏文件夹,只需在文件夹名称前加一个点(。)即可。 是的,我们可以检测文件夹是否存在。     通过使用:

File file=new File(your file path);
  if(file.exists){
   //your work
  }