• 步骤 2: 添加主要成员, 并通过 findViewById 方法获取组件引用: private final String FILE_NAME = ” fileDemo . txt ” ; private TextView labelView ; private TextView displayView ; private CheckBox appendBox ; private EditText entryText ; labelView = ( TextView ) findViewById (R. id . label ) ; displayView = ( TextView ) findViewById (R. id . display ) ; appendBox = ( CheckBox ) findViewById (R. id . append ) ; entryText = ( EditText ) findViewById (R. id . entry ) ; Button writeButton = ( Button ) findViewById (R. id . write ) ; Button readButton = ( Button ) findViewById (R. id . read ) ; • 步骤 3: 为 read 绑定事件监听器 // 为 read 绑 定 事 件 监 听 器 View . OnClickListener readButtonListener = new View . OnClickListener ( ) { @Override public void onClick ( View v ) { displayView . setText ( ” ” ) ; // 定 义 文 件 输 入 流 FileInputStream f i s = null ; try { // 获 取 指 定 文 件 对 应 的 存 储 目 录 f i s = openFileInput (FILE_NAME) ; i f ( f i s . a v a i l a b l e ( ) == 0) { return ; } // 定 义 临 时 缓 冲 区 4 4.1 实训步骤 《Android 应用程序开发》广西职业师范学院实验教学指导书 byte [ ] readBytes = new byte [ f i s . a v a i l a b l e ( ) ] ; // 读 取 文 件 的 内 容 while ( f i s . read ( readBytes ) != −1) { } // 获 取 文 件 中 的 信 息 String text = new String ( readBytes ) ; displayView . setText ( text ) ; labelView . setText ( ”文 件 读 取 成 功, 文 件 长 度: ” + text . length ( ) ) ; } catch ( FileNotFoundException e ) { e . printStackTrace ( ) ; } catch ( IOException e ) { e . printStackTrace ( ) ; } } } ; • 步骤 4: 为 wirte 事件绑定监听 // 为 write 绑 定 事 件 监 听 器 View . OnClickListener writeButtonListener = new View . OnClickListener ( ) { @Override public void onClick ( View v ) { // 定 义 文 件 输 出 流 FileOutputStream f o s = null ; try { // 判 断CheckBox是 否 以 追 加 方 式 打 开 文 件 输 出 流 i f ( appendBox . isChecked ( ) ) { f o s = openFileOutput (FILE_NAME, Context .MODE_APPEND) ; } else { f o s = openFileOutput (FILE_NAME, Context .MODE_PRIVATE) ; } // 获 取 EditText 组 件 中 的 信 息 String text = entryText . getText ( ) . toString ( ) ; // 将 t e x t 中 的 内 容 写 入 到 文 件 中 f o s . write ( text . get
时间: 2024-03-08 21:45:02 浏览: 97
Sorry, it seems like the code you provided is incomplete and missing some parts. Can you please provide more context and information about what you're trying to achieve with this code?
相关问题
移动应用开发,写一个activity文件,要求:设置外部存储pemission。d)在代码中实现按钮点击功能,在OnCreate方法中添加外部存储访问请求。点击选择文件按钮,打开文件选择框,选择相应的音频文件,返回文件路径,在点击播放、传播、暂停等按钮时,实现相应的功能,实现视频播放功能,要求如下:(1)新建视频操作类,实现SurfaceHolder.Callback, MediaController.MediaPlayerControl, MediaPlayer.OnBufferingUpdateListener。 (2)变量声明MediaPlayer、MediaController、Context、bufferupdateing。 (3)创建操作类的构造方法,初始化MediaPlayer、MediaController、Context,设置播放控制按钮的锚定位置。 (4)完善SurfaceHolder.Callback的覆写方法, (5)完善MediaController.MediaPlayerControl的覆写方法。 (6)完善实现MediaPlayer.OnBufferingUpdateListener (7)在Activity中点击播放按钮实现播放 (8)在Activity中覆写SurfaceView的OnTouchEvent方法,实现Controller显示。
以下是一个简单的实现:
首先,在 AndroidManifest.xml 文件中添加外部存储权限:
```xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
```
然后,在 Activity 的布局文件中添加一个按钮和一个 SurfaceView:
```xml
<Button
android:id="@+id/select_file_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择文件" />
<SurfaceView
android:id="@+id/surface_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
接下来,在 Activity 的 Java 文件中实现按钮点击和视频播放功能:
```java
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.MediaController;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, MediaController.MediaPlayerControl, MediaPlayer.OnBufferingUpdateListener {
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static final String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
private MediaPlayer mediaPlayer;
private MediaController mediaController;
private SurfaceHolder surfaceHolder;
private String videoPath;
private boolean bufferUpdating;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 检查外部存储权限
int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
}
// 获取 SurfaceView 和按钮
SurfaceView surfaceView = findViewById(R.id.surface_view);
Button selectFileButton = findViewById(R.id.select_file_button);
// 设置 SurfaceView 的 Holder 和 Callback
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
// 设置按钮的点击事件
selectFileButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 打开文件选择框
// 选择相应的音频文件,返回文件路径
videoPath = Environment.getExternalStorageDirectory() + "/video.mp4";
}
});
}
@Override
protected void onPause() {
super.onPause();
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release();
mediaPlayer = null;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 初始化 MediaPlayer 和 MediaController
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaController = new MediaController(this);
mediaController.setMediaPlayer(this);
mediaController.setAnchorView(findViewById(R.id.surface_view));
try {
mediaPlayer.setDataSource(videoPath);
} catch (IOException e) {
e.printStackTrace();
}
// 设置 MediaPlayer 的 Surface 和 PrepareAsync
mediaPlayer.setDisplay(holder);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaController.setEnabled(true);
mediaPlayer.start();
}
});
mediaPlayer.prepareAsync();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// Do nothing
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// Do nothing
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// 更新缓存状态
bufferUpdating = true;
mediaController.show();
mediaController.setSecondaryProgress(percent * mediaPlayer.getDuration() / 100);
bufferUpdating = false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// 显示或隐藏 Controller
mediaController.show();
return false;
}
@Override
public void start() {
mediaPlayer.start();
}
@Override
public void pause() {
mediaPlayer.pause();
}
@Override
public int getDuration() {
return mediaPlayer.getDuration();
}
@Override
public int getCurrentPosition() {
return mediaPlayer.getCurrentPosition();
}
@Override
public void seekTo(int pos) {
mediaPlayer.seekTo(pos);
}
@Override
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return bufferUpdating ? 0 : 100;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return mediaPlayer.getAudioSessionId();
}
}
```
注意,在点击播放按钮时,应该先检查视频路径是否为空,以及 MediaPlayer 是否已经准备好了。如果没有准备好,应该等待 OnPreparedListener 回调再开始播放。同时,应该在 onPause() 和 onDestroy() 中分别暂停和释放 MediaPlayer,以免造成资源浪费和内存泄漏。此外,实现 MediaController.MediaPlayerControl 接口可以让 Controller 自动显示和隐藏,并且可以通过 Controller 控制视频的播放和暂停,以及拖动进度条跳转到指定时间。
安卓实验使用绑定服务(bindService)的方式启动一个读写文件的本地服务,将界面输入的内容存储在文件(data.txt)中,并从文件中读取内容显示在界面中。 二、实验步骤 1.创建一个Activity,界面如图所示,初始状态下“保存文件”和“读取文件”两个按钮处于不可点击状态,点击“绑定服务”按钮后,启动用来读写文件的本地服务,“保存文件”和“读取文件”两个按钮恢复可点击状态,并在界面中输出简短提示信息“本地服务已经绑定”(使用toast实现)。 2.图中绿色区域是文本框控件,点击“保存文件”按钮,将文本框中输入的内容保存到文件中。并在界面中输出简短提示信息“保存文件成功”。 3.点击“读取文件”按钮,将文件中保存的内容显示在界面红色区域内。 4.点击“解绑服务”按钮,解绑当前服务,“保存文件”和“读取文件”两个按钮重置为不可点击状态,并在界面输出简短提示信息“本地服务已经解绑”。
抱歉,作为一个 AI,我没有办法在物理设备上运行实验,但是我可以给你提供一个代码示例,供你参考。
在这个示例中,我们创建了一个名为 FileService 的服务,该服务可以读写名为 data.txt 的文件。我们还创建了一个名为 MainActivity 的活动,在此活动中,我们绑定和解绑 FileService 服务,并使用 EditText、TextView 和 Button 控件来实现保存和读取文件的功能。
FileService.java:
```java
public class FileService extends Service {
private static final String TAG = "FileService";
private BufferedWriter mWriter;
private BufferedReader mReader;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new FileBinder();
}
@Override
public void onCreate() {
super.onCreate();
try {
File file = new File(getFilesDir(), "data.txt");
if (!file.exists()) {
file.createNewFile();
}
mWriter = new BufferedWriter(new FileWriter(file));
mReader = new BufferedReader(new FileReader(file));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
try {
mWriter.close();
mReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean writeFile(String content) {
if (mWriter == null) {
return false;
}
try {
mWriter.write(content);
mWriter.flush();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public String readFile() {
if (mReader == null) {
return null;
}
try {
StringBuilder sb = new StringBuilder();
String line;
while ((line = mReader.readLine()) != null) {
sb.append(line).append("\n");
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
public class FileBinder extends Binder {
public FileService getService() {
return FileService.this;
}
}
}
```
MainActivity.java:
```java
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private EditText mEditText;
private TextView mTextView;
private Button mBindButton;
private Button mSaveButton;
private Button mReadButton;
private Button mUnbindButton;
private FileService mFileService;
private boolean mIsBound;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
FileService.FileBinder binder = (FileService.FileBinder) service;
mFileService = binder.getService();
mIsBound = true;
mSaveButton.setEnabled(true);
mReadButton.setEnabled(true);
Toast.makeText(MainActivity.this, "本地服务已经绑定", Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceDisconnected(ComponentName name) {
mFileService = null;
mIsBound = false;
mSaveButton.setEnabled(false);
mReadButton.setEnabled(false);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = findViewById(R.id.edit_text);
mTextView = findViewById(R.id.text_view);
mBindButton = findViewById(R.id.bind_button);
mSaveButton = findViewById(R.id.save_button);
mReadButton = findViewById(R.id.read_button);
mUnbindButton = findViewById(R.id.unbind_button);
mBindButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, FileService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
});
mSaveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content = mEditText.getText().toString();
boolean result = mFileService.writeFile(content);
if (result) {
Toast.makeText(MainActivity.this, "保存文件成功", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "保存文件失败", Toast.LENGTH_SHORT).show();
}
}
});
mReadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String content = mFileService.readFile();
if (content != null) {
mTextView.setText(content);
} else {
Toast.makeText(MainActivity.this, "读取文件失败", Toast.LENGTH_SHORT).show();
}
}
});
mUnbindButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mIsBound) {
unbindService(mConnection);
mIsBound = false;
mSaveButton.setEnabled(false);
mReadButton.setEnabled(false);
Toast.makeText(MainActivity.this, "本地服务已经解绑", Toast.LENGTH_SHORT).show();
}
}
});
mSaveButton.setEnabled(false);
mReadButton.setEnabled(false);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mIsBound) {
unbindService(mConnection);
mIsBound = false;
}
}
}
```
在此示例中,我们使用了 bindService 方法来绑定 FileService 服务,并使用 unbindService 方法来解绑该服务。我们还使用了 Toast 控件来显示提示消息。我们还在 onDestroy 方法中解绑了服务,以确保我们在活动销毁时释放资源。
阅读全文