Skip to content

Latest commit

 

History

History
613 lines (486 loc) · 19.1 KB

4广告及录音机.md

File metadata and controls

613 lines (486 loc) · 19.1 KB

广告 录音机功能

1.进入软件时的倒计时广告

1.创建一个Activity,添加背景,并创建一个控件用来显示倒计时

注意修改布局为 relativeLayout ,并给layout加一个id

2.建立Timer计时器线程

小技巧,可以安装插件来快速查找控件。

//变量声明 全局变量
private TextView timeover;
Timer timer = new Timer();
int num =6; //想看到五,就从六开始
//onCreate函数里面
timeover = (TextView) findViewById(R.id.timeover);
TimerTask task =new TimerTask() {

            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        num--;
                        timeover.setText("-"+num+"秒 -\n跳过");
                        if(num<=1){
                            timer.cancel();//关闭计时器线程
                            Intent intent = new Intent();
                            intent.setClass(WelcomeActivity.this,LoginActivity.class);
                            startActivity(intent);
                            WelcomeActivity.this.finish(); //关闭这个界面,从登录界面就不会返回到广告界面
                        }
                    }
                });
            }

        };
timer.schedule(task,1000,1000);

3.点击跳过,跳过广告

//点击跳转,跳过广告
        timeover.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                timer.cancel();//关闭计时器线程
                Intent intent = new Intent();
                intent.setClass(WelcomeActivity.this,LoginActivity.class);
                startActivity(intent);
                WelcomeActivity.this.finish(); //关闭这个界面,从登录界面就不会返回到广告界面
            }
        });

4.点击广告,跳转到其他界面()

//变量声明,全局变量
RelativeLayout adL;
 adL=(RelativeLayout)findViewById(R.id.adLayout);//Welcome.xml中的layout的id
//点广告其他位置跳转其他页面
       adL.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               timer.cancel();//关闭计时器线程
               Intent intent = new Intent();
               intent.setClass(WelcomeActivity.this,MainActivity.class);
               startActivity(intent);
               WelcomeActivity.this.finish(); //关闭这个界面,从登录界面就不会返回到广告界面
           }
       });

WelcomeActivity代码

package com.test01;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Layout;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.Timer;
import java.util.TimerTask;

public class WelcomeActivity extends AppCompatActivity {
    private TextView timeover;
    Timer timer = new Timer();
    int num =6; //想看到五,就从六开始
    RelativeLayout adL;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);

        //多线程
        timeover = (TextView) findViewById(R.id.timeover);
        adL=(RelativeLayout)findViewById(R.id.adLayout);//Welcome.xml中的layout的id

        TimerTask task =new TimerTask() {

            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        num--;
                        timeover.setText("-"+num+"秒 -\n跳过");
                        if(num<=1){
                            timer.cancel();//关闭计时器线程
                            Intent intent = new Intent();
                            intent.setClass(WelcomeActivity.this,LoginActivity.class);
                            startActivity(intent);
                            WelcomeActivity.this.finish(); //关闭这个界面,从登录界面就不会返回到广告界面
                        }
                    }
                });
            }

        };
        timer.schedule(task,1000,1000);
        //点击跳转,跳过广告
        timeover.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                timer.cancel();//关闭计时器线程
                Intent intent = new Intent();
                intent.setClass(WelcomeActivity.this,LoginActivity.class);
                startActivity(intent);
                WelcomeActivity.this.finish(); //关闭这个界面,从登录界面就不会返回到广告界面
            }
        });

        //点广告其他位置跳转其他页面
       adL.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               timer.cancel();//关闭计时器线程
               Intent intent = new Intent();
               intent.setClass(WelcomeActivity.this,MainActivity.class);
               startActivity(intent);
               WelcomeActivity.this.finish(); //关闭这个界面,从登录界面就不会返回到广告界面
           }
       });



    }
}

2.录音机

1.寻找一个精美的录音机gif动图,将图片放到资源文件夹下。新建RecordActivity,修改xml文件为相对布局。

2.在mianActivity中建立录音机的图标,并设置点击跳转到录音机界面

在mainActivity中实现跳转的代码

        Button  record;
        record = (Button) findViewById(R.id.record);
        record.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass(MainActivity.this,RecordActivity.class);
                startActivity(intent);
        }
});

3.在record.xml界面设置。

添加控件imageView,将精美图片添加进去,设置图像大小为属性里的的大小,我的文件是250*250像素的,设置为250px

发现动图没有动。这是由于android机制决定的。

搜索WebView,让其覆盖在ImageView,令其大小与ImageView大小相同。

添加四个按钮,给按钮设置id,并设置显示的文字。

xml代码如下

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test01.LoginActivity"
    >


    <Button
        android:id="@+id/start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始录音"
        android:layout_alignBaseline="@+id/end"
        android:layout_alignBottom="@+id/end"
        android:layout_alignStart="@+id/play" />

    <Button
        android:id="@+id/stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="停止录音"
        android:layout_marginEnd="67dp"
        android:layout_marginBottom="58dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true" />

    <Button
        android:id="@+id/play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="播放录音"
        android:layout_marginStart="41dp"
        android:layout_marginTop="68dp"
        android:layout_below="@+id/start"
        android:layout_alignParentStart="true" />

    <Button
        android:id="@+id/end"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="暂停播放"
        android:layout_above="@+id/stop"
        android:layout_alignStart="@+id/stop"
        android:layout_marginBottom="38dp" />

    <ImageView
        android:id="@+id/stopView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/luyinji"
        android:layout_alignParentTop="true"
        android:layout_alignEnd="@+id/end" />

    <WebView
        android:id="@+id/playView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignBottom="@+id/stopView"
        android:layout_alignEnd="@+id/stopView"
        android:layout_alignParentTop="true"
        android:layout_alignStart="@+id/stopView"
        android:visibility="invisible" />

</RelativeLayout>

在对应的Activity中获取控件,可以通过右键加FindViewByMe得到。

activity文件内容如下

package com.test01;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.ImageView;

public class RecordActivity extends AppCompatActivity {
    private ImageView stopView;
    private WebView playView;
    private Button start;
    private Button stop;
    private Button play;
    private Button end;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_record);

        stopView = (ImageView) findViewById(R.id.stopView);
        playView = (WebView) findViewById(R.id.playView);
        start = (Button) findViewById(R.id.start);
        stop = (Button) findViewById(R.id.stop);
        play = (Button) findViewById(R.id.play);
        end = (Button) findViewById(R.id.end);
//使用webView载入图片
        playView.loadUrl("file:///android_asset/luyinji.gif");
    }
}

4.权限设置。

在AndroidManifest.xml中添加使用的权限

	<!-- 录音权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <!-- 文件写入权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!-- 读写系统文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEM"/>

同样,在RecordActivity中

使用数组及判断版本

5.点击,动图变化实现

webView显示图片,由于路径问题需要新建立文件夹并把文件放进去。

注意文件路径应该是三条斜线

设置按钮点击事件,实现动图的显示

        //点击开始录音按钮时,动图显示
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopView.setVisibility(View.INVISIBLE);
                playView.setVisibility(View.VISIBLE);
            }
        });
        //点击开始播放录音,动图显示
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopView.setVisibility(View.INVISIBLE);
                playView.setVisibility(View.VISIBLE);
            }
        });
        //点击停止录音按钮时,动图不显示
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopView.setVisibility(View.VISIBLE);
                playView.setVisibility(View.INVISIBLE);
            }
        });
        //点击停止播放录音按钮时,动图不显示
        end.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                stopView.setVisibility(View.VISIBLE);
                playView.setVisibility(View.INVISIBLE);
            }
        });

作业,思考如果录音没有开始,能不能点击等逻辑问题。

6.功能实现

录音

核心代码

/*变量初始化
//编码方式,后缀名,存储路径,声音来源
MediaRecorder mediaRecorder= null;//录音机
MediaPlayer mediaPlayer = null;//内置播放器
String FileName = null;//存放路径
*/
/*
//录音开始
//录音对象的准备
mediaRecorder = new MediaRecorder();
                    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//声音来源
                    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);//设置输出格式
                    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置编码方式
mediaRecorder.setOutputFile(FileName);//输出到哪一个文件

try{
    mediaRecorder.prepare();
    mediaRecorder.start();
    }catch (Exception e){
           e.printStackTrace();
         }
 */
/*
//结束录音
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder=null;
*/
/*
//媒体播放器
mediaPlayer= new MediaPlayer();
 try {
       mediaPlayer.setDataSource(FileName);
       mediaPlayer.prepare();
       mediaPlayer.start();

   }catch (Exception e){
           e.printStackTrace();
        }
  */

RecordActivity完整代码

package com.test01;

import android.Manifest;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.ImageView;

public class RecordActivity extends AppCompatActivity {
    private ImageView stopView;
    private WebView playView;
    private Button start;
    private Button stop;
    private Button play;
    private Button end;
    Boolean LuyinFlag,BoFangFlag;//录音flag,播放flag实现逻辑

    //编码方式,后缀名,存储路径,声音来源
    MediaRecorder mediaRecorder= null;//录音机
    MediaPlayer mediaPlayer = null;//内置播放器
    String FileName = null;//存放路径


    //声明数组,用来保存所有需要动态开启的权限
    private static String[] PERMISSION_STORGE={
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS,
            Manifest.permission.RECORD_AUDIO
    };
    //权限的请求编码
    //常量 1
    private  static  int REQUEST_PERMISSION_CODE = 1;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_record);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
        //判断版本
        //如果版本大于5.0
        if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP){
            //如果没有被授权
            if(ActivityCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                //在当前界面,请求数组的所有权限 --应该逐个请求
                ActivityCompat.requestPermissions(this,PERMISSION_STORGE,REQUEST_PERMISSION_CODE);//参数,请求的页面,请求的编码

            }
        }

        stopView = (ImageView) findViewById(R.id.stopView);
        playView = (WebView) findViewById(R.id.playView);
        start = (Button) findViewById(R.id.start);
        stop = (Button) findViewById(R.id.stop);
        play = (Button) findViewById(R.id.play);
        end = (Button) findViewById(R.id.end);
        LuyinFlag=false;
        BoFangFlag=false;
        //使用webView载入图片
        playView.loadUrl("file:///android_asset/luyinji.gif");
        //内存路径获取
        FileName = Environment.getExternalStorageDirectory().getAbsolutePath();//文件夹绝对路径
        FileName+="/myRecord.amr";//生成的文件名字


        //点击开始录音按钮时,动图显示
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (LuyinFlag == false) {
                    stopView.setVisibility(View.INVISIBLE);
                    playView.setVisibility(View.VISIBLE);
                    LuyinFlag = true;

                    //录音对象的准备
                    mediaRecorder = new MediaRecorder();
                    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//声音来源
                    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);//设置输出格式
                    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置编码方式
                    mediaRecorder.setOutputFile(FileName);//输出到哪一个文件

                    try{
                        mediaRecorder.prepare();
                        mediaRecorder.start();
                    }catch (Exception e){
                        e.printStackTrace();
                    }

                }
            }
        });
        //点击开始播放录音,动图显示
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                    stopView.setVisibility(View.INVISIBLE);
                    playView.setVisibility(View.VISIBLE);
                    BoFangFlag =true;

                    mediaPlayer= new MediaPlayer();
                    try {
                        mediaPlayer.setDataSource(FileName);
                        mediaPlayer.prepare();
                        mediaPlayer.start();

                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }

        });
        //点击停止录音按钮时,动图不显示
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (LuyinFlag==true) {
                    stopView.setVisibility(View.VISIBLE);
                    playView.setVisibility(View.INVISIBLE);
                    LuyinFlag=false;

                    mediaRecorder.stop();
                    mediaRecorder.release();
                    mediaRecorder=null;

                }
            }
        });
        //点击停止播放录音按钮时,动图不显示
        end.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (BoFangFlag == true) {
                    stopView.setVisibility(View.VISIBLE);
                    playView.setVisibility(View.INVISIBLE);


                    mediaPlayer.pause();



                }
            }
        });


    }
}