我正在尝试构建一个可以打开和关闭设备的相机闪光灯的应用。在Code中它没有显示任何错误,但在我的设备上启动应用程序时,它开始崩溃。
报告错误显示一些Unable to start activity
和Fail to connect Camera Services
之类的内容。
由于我是android开发的新手,并且没有足够的知识。
我已经看到很少有关于此的问题,但无法找到一些有用的信息。所有答案都大致建议在清单文件中添加权限,我已经这样做了。
清单文件的内容:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.joshiyogesh.flashlight">
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
主要活动Java的内容:
package com.example.joshiyogesh.flashlight;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
Button btn;
android.hardware.Camera camera;
Camera.Parameters parameters;
boolean isFlash = false;
boolean isOn = false;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button)findViewById(R.id.button2);
if(getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH))
{
camera = Camera.open();
parameters = camera.getParameters();
isFlash = true;
}
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isFlash){
if(!isOn){
btn.setText("Off");
btn.setBackgroundColor(Color.GREEN);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
isOn = true;
}
else{
btn.setText("ON");
btn.setBackgroundColor(Color.RED);
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
isOn = false;
}
}
else{
Toast.makeText(MainActivity.this,"Camera Not detecting",Toast.LENGTH_LONG).show();
}
}
});
}
@Override
protected void onStop() {
super.onStop();
if(camera!=null){
camera.release();
camera = null;
}
}
}
答案 0 :(得分:0)
我发布了打开相机的代码,请根据需要进行更改。
试试这个:
<ig:XamGrid AutoGenerateColumns="False" ItemsSource="{Binding Items}" >
<ig:XamGrid.SortingSettings>
<ig:SortingSettings ></ig:SortingSettings>
</ig:XamGrid.SortingSettings>
<ig:XamGrid.Columns>
<ig:TextColumn Key="Side" MinimumWidth="20" Width="50">
<ig:TextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="Side" ToolTip="Trade Side"></TextBlock>
</DataTemplate>
</ig:TextColumn.HeaderTemplate>
</ig:TextColumn>
<ig:TextColumn Key="CreatedOn" MinimumWidth="30" Width="68" FormatString="{}{0:HH:mm:ss}" AllowToolTips="Always" IsSorted="Descending">
<ig:TextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="Created On" ToolTip="Date and time trade was created"/>
</DataTemplate>
</ig:TextColumn.HeaderTemplate>
<ig:TextColumn.ToolTipContentTemplate>
<DataTemplate>
<TextBlock Text="{Binding CreatedOn, StringFormat={}{0:dd/MM/yyyy HH:mm:ss:fff}}" />
</DataTemplate>
</ig:TextColumn.ToolTipContentTemplate>
</ig:TextColumn>
</ig:XamGrid.Columns>
</ig:XamGrid>
并声明以下内容:
static Camera camera = null;
使用相机后,请不要忘记按以下声明发布:
try{
if(clickOn == true) {
clickOn = false;
camera = Camera.open();
Parameters parameters = camera.getParameters();
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
remoteViews.setViewVisibility(R.id.button1, View.GONE);
remoteViews.setViewVisibility(R.id.button2, View.VISIBLE);
localAppWidgetManager.updateAppWidget(componentName, remoteViews);
} else {
clickOn = true;
camera.stopPreview();
camera.release();
camera = null;
remoteViews.setViewVisibility(R.id.button1, View.VISIBLE);
remoteViews.setViewVisibility(R.id.button2, View.GONE);
localAppWidgetManager.updateAppWidget(componentName, remoteViews);
}
} catch(Exception e) {
Log.e("Error", ""+e);
}
也可能是您的应用未获得在运行时打开相机的权限。因为从android 6.0开始,必须具有执行特定任务的运行时权限。
因此,如果您使用的是Android 6.0(Marshmallow)或更高版本,请按照以下步骤检查是否启用了权限:
可以禁用相机权限,并应从应用设置启用。设置 - &gt;应用 - &gt; [您的应用] - &gt;权限。
这对我有用。希望这也有助于你:)
修改强>
请使用camera.release();
块中的e.printstacktrace()
来获取错误logcat。
答案 1 :(得分:0)
我认为释放相机时出现问题。由于您已在release
中撰写了method
onStop
,因此只有在应用关闭时您的相机才会发布。当您在按钮release
中关闭闪光灯时,尝试click method
相机。
答案 2 :(得分:0)
我遇到了错误的地方。上面写的代码是对的。唯一的问题,我使用棉花糖,我们必须通过设备获得相机许可。