我是android的新手,我正在尝试制作一个可以分析噪音水平的应用程序,我发现一个有用的资源,不幸的是我得到了上面提到的错误。我附上了我的所有文件,因此任何修复此问题的线索都会非常感激。
这是清单文件。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.prabalgupta.noisealert"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<activity
android:name="com.androidexample.noisealert.NoiseAlert"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--
ATTENTION: This was auto-generated to add Google Play services to your project for
App Indexing. See https://g.co/AppIndexing/AndroidStudio for more information.
-->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
</application>
</manifest>
noisealert.java
import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
public class NoiseAlert extends Activity {
/* constants */
private static final int POLL_INTERVAL = 300;
/**
* running state
**/
private boolean mRunning = false;
/**
* config state
**/
private int mThreshold;
private PowerManager.WakeLock mWakeLock;
private Handler mHandler = new Handler();
/* References to view elements */
private TextView mStatusView;
private SoundLevelView mDisplay;
/* data source */
private SoundMeter mSensor;
/******************
* Define runnable thread again and again detect noise
*********/
private Runnable mSleepTask = new Runnable() {
public void run() {
//Log.i("Noise", "runnable mSleepTask");
start();
}
};
// Create runnable thread to Monitor Voice
private Runnable mPollTask = new Runnable() {
public void run() {
double amp = mSensor.getAmplitude();
//Log.i("Noise", "runnable mPollTask");
updateDisplay("Monitoring Voice...", amp);
if ((amp > mThreshold)) {
callForHelp();
//Log.i("Noise", "==== onCreate ===");
}
// Runnable(mPollTask) will again execute after POLL_INTERVAL
mHandler.postDelayed(mPollTask, POLL_INTERVAL);
}
};
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
private GoogleApiClient client;
/*********************************************************/
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Defined SoundLevelView in main.xml file
setContentView(R.layout.main);
mStatusView = (TextView) findViewById(R.id.status);
// Used to record voice
mSensor = new SoundMeter();
mDisplay = (SoundLevelView) findViewById(R.id.volume);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "NoiseAlert");
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}
@Override
public void onResume() {
super.onResume();
//Log.i("Noise", "==== onResume ===");
initializeApplicationConstants();
mDisplay.setLevel(0, mThreshold);
if (!mRunning) {
mRunning = true;
start();
}
}
@Override
public void onStop() {
super.onStop();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
Action viewAction = Action.newAction(
Action.TYPE_VIEW, // TODO: choose an action type.
"NoiseAlert Page", // TODO: Define a title for the content shown.
// TODO: If you have web page content that matches this app activity's content,
// make sure this auto-generated web page URL is correct.
// Otherwise, set the URL to null.
Uri.parse("http://host/path"),
// TODO: Make sure this auto-generated app deep link URI is correct.
Uri.parse("android-app://com.example.prabalgupta.noisealert/http/host/path")
);
AppIndex.AppIndexApi.end(client, viewAction);
// Log.i("Noise", "==== onStop ===");
//Stop noise monitoring
stop();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client.disconnect();
}
private void start() {
//Log.i("Noise", "==== start ===");
mSensor.start();
if (!mWakeLock.isHeld()) {
mWakeLock.acquire();
}
//Noise monitoring start
// Runnable(mPollTask) will execute after POLL_INTERVAL
mHandler.postDelayed(mPollTask, POLL_INTERVAL);
}
private void stop() {
Log.i("Noise", "==== Stop Noise Monitoring===");
if (mWakeLock.isHeld()) {
mWakeLock.release();
}
mHandler.removeCallbacks(mSleepTask);
mHandler.removeCallbacks(mPollTask);
mSensor.stop();
mDisplay.setLevel(0, 0);
updateDisplay("stopped...", 0.0);
mRunning = false;
}
private void initializeApplicationConstants() {
// Set Noise Threshold
mThreshold = 8;
}
private void updateDisplay(String status, double signalEMA) {
mStatusView.setText(status);
//
mDisplay.setLevel((int) signalEMA, mThreshold);
}
private void callForHelp() {
//stop();
// Show alert when noise thersold crossed
Toast.makeText(getApplicationContext(), "Noise Thersold Crossed, do here your stuff.",
Toast.LENGTH_LONG).show();
}
@Override
public void onStart() {
super.onStart();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client.connect();
Action viewAction = Action.newAction(
Action.TYPE_VIEW, // TODO: choose an action type.
"NoiseAlert Page", // TODO: Define a title for the content shown.
// TODO: If you have web page content that matches this app activity's content,
// make sure this auto-generated web page URL is correct.
// Otherwise, set the URL to null.
Uri.parse("http://host/path"),
// TODO: Make sure this auto-generated app deep link URI is correct.
Uri.parse("android-app://com.example.prabalgupta.noisealert/http/host/path")
);
AppIndex.AppIndexApi.start(client, viewAction);
}
};
SoundLevelView.java
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
class SoundLevelView extends View {
private Drawable mGreen;
private Drawable mRed;
private Paint mBackgroundPaint;
private int mHeight;
private int mWidth;
private int mThreshold = 0;
private int mVol = 0;
public SoundLevelView(Context context, AttributeSet attrs) {
super(context, attrs);
mGreen = context.getResources().getDrawable(
R.drawable.greenbar);
mRed = context.getResources().getDrawable(
R.drawable.redbar);
mWidth = mGreen.getIntrinsicWidth();
setMinimumWidth(mWidth*10);
mHeight = mGreen.getIntrinsicHeight();
setMinimumHeight(mHeight);
//Used to paint canvas background color
mBackgroundPaint = new Paint();
mBackgroundPaint.setColor(Color.BLACK);
}
public void setLevel(int volume, int threshold) {
if (volume == mVol && threshold == mThreshold) return;
mVol = volume;
mThreshold = threshold;
// invalidate Call onDraw method and draw voice points
invalidate();
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawPaint(mBackgroundPaint);
for (int i=0; i<= mVol; i++) {
Drawable bar;
if (i< mThreshold)
bar = mGreen;
else
bar = mRed;
bar.setBounds((10-i)*mWidth, 0, (10-i+1)*mWidth, mHeight);
bar.draw(canvas);
}
}
}
SoundMeter.java
import java.io.IOException;
import android.media.MediaRecorder;
public class SoundMeter {
// This file is used to record voice
static final private double EMA_FILTER = 0.6;
private MediaRecorder mRecorder = null;
private double mEMA = 0.0;
public void start() {
if (mRecorder == null) {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
try {
mRecorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mRecorder.start();
mEMA = 0.0;
}
}
public void stop() {
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
public double getAmplitude() {
if (mRecorder != null)
return (mRecorder.getMaxAmplitude()/2700.0);
else
return 0;
}
public double getAmplitudeEMA() {
double amp = getAmplitude();
mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
return mEMA;
}
Activity_noise_alert.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<TextView
android:id="@+id/status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="25sp"
android:textStyle="bold"
android:text="stopped"
/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
>
<com.androidexample.noisealert.SoundLevelView
android:id="@+id/volume"
android:layout_width="230sp"
android:layout_height="60sp"
/>
</LinearLayout>
</RelativeLayout>
答案 0 :(得分:0)
在您的清单文件中,您正尝试为应用程序设置一个图标
通过此代码android:icon="@drawable/icon"
。
这意味着你应该在res/drawable
文件夹中有一个icon.png img。另外将一个icon.png img放在drawable文件夹中,然后你的问题就会得到解决。没有强制要求img文件名是icon.png,它可以是任何名称,如ic_launcher.png .....那么你需要改变你的清单文件,如android:icon="@drawable/ic_launcher"
但img将是png格式。
谢谢