【发布时间】:2017-09-03 20:36:54
【问题描述】:
我正在尝试从片段实例化一个新活动。而且我一直遇到同样的错误。
Java.Lang.ClassNotFoundException:在路径上找不到类“BarcodeFragmentActivity”:DexPathList[[zip 文件“/data/app/StockApp.StockApp-1/base.apk”],nativeLibraryDirectories=[/data/app /StockApp.StockApp-1/lib/arm, /system/fake-libs, /data/app/StockApp.StockApp-1/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib] ]
我使用的是 Visual Studio 2017 版本 15.3.3。 我已经到处搜索了这个问题的答案,但无论我尝试了什么,我仍然遇到同样的错误。当我尝试添加
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
抛出一个错误,它在构建时找不到 BarcodeFragment。
我的 Android 清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="StockApp.StockApp" android:versionCode="1"
android:versionName="1.0" android:installLocation="preferExternal">
<uses-sdk android:minSdkVersion="23" />
<uses-permission android:name="android.permission.CAMERA" />
<application android:allowBackup="true" android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light.DarkActionBar"
android:supportsRtl="true">
<activity android:name=".barcodeFragment" android:label="Barcode Fragment"></activity>
<activity android:name=".barcodeFragmentActivity" android:label="Activity Barcode" android:parentActivityName=".barcodeFragment">
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".barcodeFragmentActivity"></meta-data>
</activity>
</application>
调用活动的片段:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Gms.Vision.Barcodes;
using Android.Gms.Common.Apis;
using Android.Support.V4.View;
using Android.Support.V4.App;
using Android.Support.V7.App;
namespace StockApp
{
class BarcodeFragment : Android.Support.V4.App.Fragment, View.IOnClickListener
{
private CompoundButton autoFocus { get; set; }
private CompoundButton useFlash { get; set; }
private Button btnReadBarcode { get; set; }
private TextView statusMessage { get; set; }
private TextView barcodeValue { get; set; }
private static int RC_BARCODE_CAPTURE = 9001;
private static string TAG = "BarcodeMain";
public BarcodeFragment() { }
public void OnClick(View v)
{
if (v.Id == Resource.Id.read_barcode)
{
Intent intent = new Intent(Context.ApplicationContext,Activity.ClassLoader.LoadClass("barcodeFragmentActivity"));//("StockApp.StockApp", typeof(BarcodeFragmentActivity));
//intent.SetClassName("StockApp.StockApp", );
intent.PutExtra("AutoFocus", autoFocus.Checked);
intent.PutExtra("UseFlash", useFlash.Checked);
if (intent.ResolveActivity(Activity.PackageManager) != null)
{
StartActivityForResult(intent, RC_BARCODE_CAPTURE);
}
}
}
public override void OnActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == RC_BARCODE_CAPTURE)
{
if(resultCode == CommonStatusCodes.Success)
{
if(data != null)
{
// Barcode barcode = data.GetParcelableExtra(BarcodeFragmentActivity.BarcodeObject);
}
}
}
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View view = inflater.Inflate(Resource.Layout.Fragment_BarcodeMain, container, false);
statusMessage = view.FindViewById(Resource.Id.txtBarcodeStatus) as TextView;
barcodeValue = view.FindViewById(Resource.Id.txtBarcodeValue) as TextView;
autoFocus = view.FindViewById(Resource.Id.auto_focus) as CompoundButton;
useFlash = view.FindViewById(Resource.Id.use_flash) as CompoundButton;
view.FindViewById(Resource.Id.read_barcode).SetOnClickListener(this);
btnReadBarcode = view.FindViewById(Resource.Id.read_barcode) as Button;
return view;
}
public static BarcodeFragment newInstance()
{
BarcodeFragment fragment = new BarcodeFragment();
Bundle args = new Bundle();
fragment.Arguments = args;
return fragment;
}
}
}
我的 BarcodeFragmentActivity 代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Content.PM;
using Android.Gms.Vision.Barcodes;
using Android.Gms.Common.Apis;
using Android.Gms.Common;
using Android.Gms.Vision;
using Android.Hardware;
using Android.Support.V4.View;
using Android.Support.V4.App;
using Android.Support.V7.App;
using Android.Support.Design.Widget;
using StockApp.UI;
using StockApp.BarcodeReader;
namespace StockApp
{
class BarcodeFragmentActivity : AppCompatActivity
{
private static string tag = "Barcode-Reader";
private static int RC_HANDLE_GMS = 9001;
private static int RC_HANDLE_CAMERA_PERM = 2;
public static string AutoFocus = "AutoFocus";
public static string UseFlash = "UseFlash";
public static string BarcodeObject = "Barcode";
private CameraSourcePreview<BarcodeGraphic> mPreview;
private Android.Gms.Vision.CameraSource mCameraSource;
private GraphicOverlay<BarcodeGraphic> mGraphicOverlay;
private ScaleGestureDetector scaleGestureDetector;
private GestureDetector getsureDetector;
private View layout;
private static BarcodeFragmentActivity thisInstance;
protected override void OnCreate(Bundle savedInstanceState)
{
thisInstance = this;
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Barcode_Capture);
mPreview = (CameraSourcePreview<BarcodeGraphic>)FindViewById(Resource.Id.preview);
mGraphicOverlay = (GraphicOverlay<BarcodeGraphic>)FindViewById(Resource.Id.graphicOverlay);
bool autoFocus = Intent.GetBooleanExtra(AutoFocus, false);
bool useFlash = Intent.GetBooleanExtra(UseFlash, false);
int rc = (int) ActivityCompat.CheckSelfPermission(this, Manifest.Permission.Camera);
if (rc == (int) Permission.Granted)
{
createCameraSource(autoFocus, useFlash);
}
else
{
requestCameraPermission();
}
getsureDetector = new GestureDetector(this, new CaptureGestureListener());
}
private void requestCameraPermission()
{
string[] permissions = new string[] { Manifest.Permission.CallPhone };
if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.Camera))
{
Snackbar.Make(layout, "Require Camera Permions To Read Barcodes", Snackbar.LengthIndefinite)
.SetAction("Ok", new Action<View> (delegate(View obj)
{
ActivityCompat.RequestPermissions(this, permissions, RC_HANDLE_CAMERA_PERM);
}
)).Show();
}
else
{
ActivityCompat.RequestPermissions(this, permissions, RC_HANDLE_CAMERA_PERM);
}
//Activity thisActivity = this;
//View.IOnClickListener listener = new View.IOnClickListener;
}
public override bool OnTouchEvent(MotionEvent e)
{
bool b = scaleGestureDetector.OnTouchEvent(e);
bool c = getsureDetector.OnTouchEvent(e);
return b || c || base.OnTouchEvent(e);
}
private void createCameraSource(bool autoFocus, bool useFlash)
{
Context context = ApplicationContext;
BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).Build();
BarcodeTrackerFactory barcodeFactory = new BarcodeTrackerFactory(mGraphicOverlay);
barcodeDetector.SetProcessor(
new MultiProcessor.Builder(barcodeFactory).Build());
if (!barcodeDetector.IsOperational)
{
IntentFilter lowstorageFilter = new IntentFilter(Intent.ActionDeviceStorageLow);
bool hasLowStorage = RegisterReceiver(null, lowstorageFilter) != null;
if (hasLowStorage)
{
Toast.MakeText(this, "Low Storage Error", ToastLength.Long);
}
}
Android.Gms.Vision.CameraSource.Builder builder = new Android.Gms.Vision.CameraSource.Builder(base.ApplicationContext, barcodeDetector)
.SetFacing(Android.Gms.Vision.CameraFacing.Back)
.SetRequestedPreviewSize(1600, 1024)
.SetRequestedFps(15.0f)
.SetAutoFocusEnabled(true);
mCameraSource = builder.Build();
}
private void startCameraSource()
{
int code = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(ApplicationContext);
if(code != ConnectionResult.Success)
{
Dialog dig = GoogleApiAvailability.Instance.GetErrorDialog(this, code, RC_HANDLE_GMS);
dig.Show();
}
if (mCameraSource != null)
{
try
{
mPreview.start(mCameraSource, mGraphicOverlay);
}
catch (InvalidOperationException)
{
mCameraSource.Release();
mCameraSource = null;
}
}
}
private bool OnTap(float rawX, float rawY)
{
int[] location = new int[2];
mGraphicOverlay.GetLocationOnScreen(location);
float x = (rawX - location[0]);
float y = (rawY - location[1]);
Barcode best = null;
float bestDistance = float.MaxValue;
foreach (BarcodeGraphic graphic in mGraphicOverlay.getGraphics())
{
Barcode barcode = graphic.GetBarcode();
if(barcode.BoundingBox.Contains((int)x,(int)y))
{
best = barcode;
break;
}
float dx = x - barcode.BoundingBox.CenterX();
float dy = y - barcode.BoundingBox.CenterY();
float distance = (dx * dx) + (dy * dy);
if ( distance > bestDistance)
{
best = barcode;
bestDistance = distance;
}
if (best != null)
{
Intent data = new Intent();
data.PutExtra(BarcodeObject, best);
SetResult(CommonStatusCodes.Success, data);
Finish();
return true;
}
}
return false;
}
protected override void OnResume()
{
base.OnResume();
startCameraSource();
}
protected override void OnPause()
{
base.OnPause();
if (mPreview != null)
{
mPreview.stop();
}
}
protected override void OnDestroy()
{
base.OnDestroy();
if(mPreview != null)
{
mPreview.release();
}
}
private class CaptureGestureListener : GestureDetector.SimpleOnGestureListener
{
public override bool OnSingleTapConfirmed(MotionEvent e)
{
return thisInstance.OnTap(e.RawX, e.RawY) || base.OnSingleTapConfirmed(e);
}
}
private class ScaleListener : ScaleGestureDetector.IOnScaleGestureListener
{
public IntPtr Handle => throw new NotImplementedException();
public void Dispose()
{
throw new NotImplementedException();
}
public bool OnScale(ScaleGestureDetector detector)
{
return false;
}
public bool OnScaleBegin(ScaleGestureDetector detector)
{
return true;
}
public void OnScaleEnd(ScaleGestureDetector detector)
{
}
}
}
}
【问题讨论】:
标签: android visual-studio xamarin.android