0

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

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

还有一个问题:

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

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

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

我的这个想法是,每次创建音频时,都会再次在 sdcard 上的文件夹中列出所有音频。但是这是一些问题,因为也许人们会更改或修改(例如将其他音频复制到我的文件夹或重命名或通过剪切或合并修改其中一个音频)现在应用程序如何理解此事件?您的帮助将不胜感激...

更新:我阅读了这个链接并发现了这个:Using Shared Preferences

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

用户偏好

共享偏好并不严格用于保存“用户偏好”,例如用户选择的铃声。如果您有兴趣为您的应用程序创建用户首选项,请参阅 PreferenceActivity,它为您提供了一个 Activity 框架来创建用户首选项,该用户首选项将自动持久化(使用共享首选项)。

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

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();
    }
}

并阅读此链接之前建议过我。 如何在 Android 上刷新 MediaStore?

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

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

`导入android.app.Activity;

导入 android.content.SharedPreferences;导入android.os.Bundle;

导入android.util.Log;

导入 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 是一个用于录制音频并将音频保存到我在 SD 卡上的特殊文件夹中的类。和 main.xml 有 2 个按钮“录制和停止”和一个用于显示我的音频名称的文本视图,当再次运行时,它显示更改的音频名称。(如果需要更改)

4

2 回答 2

0

你必须稍微改变你的逻辑,我假设当你创建音频时,你只需将它写入 SD 卡。为了区分您的声音与其他人的声音(在该文件夹中),您必须在某处维护创建的声音列表

您可以通过多种方式做到这一点:

  1. 共享首选项
  2. SQLlite 数据库
  3. 以纯文本写入 sd 卡中的附加文本文件(您也可以对其进行加密、移位字节 - 做一些事情,这样文本编辑器或其他人将无法读取它)

希望这可以帮助

编辑:

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

请参阅我的其他答案,了解如何做到这一点: 在 android 中存储对象的最合适方法是什么?

于 2013-10-22T12:33:47.803 回答
0

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

File file=new File(your file path);
  if(file.exists){
   //your work
  }
于 2013-10-22T13:29:29.920 回答