当前位置: 首页 > 知识库问答 >
问题:

Azure认知服务面向Android-NoClassDefFounderRor

太叔景曜
2023-03-14

我试图使一个应用程序来检测脸使用脸API从Azure的教程。当我尝试运行应用程序时,我得到一个错误:

noClassDefFoundError:解析失败:lorg/apache/http/impl/client/defaultHttpClient;

下面是我的代码:

MainActivity.java

package com.contoso.facetutorial;

// <snippet_imports>
import java.io.*;
import java.lang.Object.*;
import android.app.*;
import android.content.*;
import android.net.*;
import android.os.*;
import android.view.*;
import android.graphics.*;
import android.widget.*;
import android.provider.*;
// </snippet_imports>

// <snippet_face_imports>
import com.microsoft.projectoxford.face.*;
import com.microsoft.projectoxford.face.contract.*;
// </snippet_face_imports>

public class MainActivity extends Activity {
    // <snippet_mainactivity_fields>
    // Add your Face endpoint to your environment variables.
    private final String apiEndpoint = "https://ceranfaceapi.cognitiveservices.azure.com/";
    // Add your Face subscription key to your environment variables.
    private final String subscriptionKey = "xxxx";

    private final FaceServiceClient faceServiceClient =
            new FaceServiceRestClient(apiEndpoint, subscriptionKey);

    private final int PICK_IMAGE = 1;
    private ProgressDialog detectionProgressDialog;
    // </snippet_mainactivity_fields>

    // <snippet_mainactivity_methods>
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1 = findViewById(R.id.button1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("image/*");
                startActivityForResult(Intent.createChooser(
                        intent, "Select Picture"), PICK_IMAGE);
            }
        });

        detectionProgressDialog = new ProgressDialog(this);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_IMAGE && resultCode == RESULT_OK &&
                data != null && data.getData() != null) {
            Uri uri = data.getData();
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(
                        getContentResolver(), uri);
                ImageView imageView = findViewById(R.id.imageView1);
                imageView.setImageBitmap(bitmap);

                // Comment out for tutorial
                detectAndFrame(bitmap);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // </snippet_mainactivity_methods>
    }

    // <snippet_detection_methods>
    // Detect faces by uploading a face image.
    // Frame faces after detection.
    private void detectAndFrame(final Bitmap imageBitmap) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
        ByteArrayInputStream inputStream =
                new ByteArrayInputStream(outputStream.toByteArray());

        AsyncTask<InputStream, String, Face[]> detectTask =
                new AsyncTask<InputStream, String, Face[]>() {
                    String exceptionMessage = "";

                    @Override
                    protected Face[] doInBackground(InputStream... params) {
                        try {
                            publishProgress("Detecting...");
                            Face[] result = faceServiceClient.detect(
                                    params[0],
                                    true,         // returnFaceId
                                    false,        // returnFaceLandmarks
                                    null          // returnFaceAttributes:
                                    /* new FaceServiceClient.FaceAttributeType[] {
                                        FaceServiceClient.FaceAttributeType.Age,
                                        FaceServiceClient.FaceAttributeType.Gender }
                                    */
                            );
                            if (result == null){
                                publishProgress(
                                        "Detection Finished. Nothing detected");
                                return null;
                            }
                            publishProgress(String.format(
                                    "Detection Finished. %d face(s) detected",
                                    result.length));
                            return result;
                        } catch (Exception e) {
                            exceptionMessage = String.format(
                                    "Detection failed: %s", e.getMessage());
                            return null;
                        }
                    }

                    @Override
                    protected void onPreExecute() {
                        //TODO: show progress dialog
                        detectionProgressDialog.show();
                    }
                    @Override
                    protected void onProgressUpdate(String... progress) {
                        //TODO: update progress
                        detectionProgressDialog.setMessage(progress[0]);
                    }
                    @Override
                    protected void onPostExecute(Face[] result) {
                        //TODO: update face frames
                        detectionProgressDialog.dismiss();

                        if(!exceptionMessage.equals("")){
                            showError(exceptionMessage);
                        }
                        if (result == null) return;

                        ImageView imageView = findViewById(R.id.imageView1);
                        imageView.setImageBitmap(
                                drawFaceRectanglesOnBitmap(imageBitmap, result));
                        imageBitmap.recycle();
                    }
                };

        detectTask.execute(inputStream);
    }

    private void showError(String message) {
        new AlertDialog.Builder(this)
                .setTitle("Error")
                .setMessage(message)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                    }})
                .create().show();
    }
    // </snippet_detection_methods>

    // <snippet_drawrectangles>
    private static Bitmap drawFaceRectanglesOnBitmap(
            Bitmap originalBitmap, Face[] faces) {
        Bitmap bitmap = originalBitmap.copy(Bitmap.Config.ARGB_8888, true);
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.RED);
        paint.setStrokeWidth(10);
        if (faces != null) {
            for (Face face : faces) {
                FaceRectangle faceRectangle = face.faceRectangle;
                canvas.drawRect(
                        faceRectangle.left,
                        faceRectangle.top,
                        faceRectangle.left + faceRectangle.width,
                        faceRectangle.top + faceRectangle.height,
                        paint);
            }
        }
        return bitmap;
    }
    // </snippet_drawrectangles>
}

共有1个答案

易星纬
2023-03-14

为了继续使用Apache HTTP客户端,针对Android9及以上版本的应用程序可以在AndroidManifest.xml添加以下内容:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>
 类似资料:
  • 对hi-nginx-java而言,服务即URI指向的实体类。因为URI与Class之间的映射关系,所以所谓面向服务即提供URI/a/b/c指向的Classa.b.c。 比如,对表websites提供CRUD服务.如果规划的URI包括:/website/info,/website/insert,/website/update,/website/delete,/website/list,那么对应的Cl

  • [我也面临同样的问题,在stackoverflow上已经报道过][1]当在8.1.0中启动地面服务时,我收到了应用程序崩溃的通知。错误日志也在下面。它在Android8.0和Android9中运行良好。任何人都面临这个问题。 误差

  • 我正在写一封信。Net核心web应用程序,其中我使用Azure-计算机视觉。 我所做的一切都如图所示: https://docs.microsoft.com/pl-pl/azure/cognitive-services/computer-vision/vs-computer-vision-connected-service 我的问题是: 计算机视觉API结果: {“statusCode”:401,

  • 我们几乎没有UI使用的微服务。AzureB2C是我们的身份验证提供程序。每个微服务(API)都需要访问令牌,并且需要与数据库进行授权。此数据库具有基于角色的门禁权限。 今天的情况是这样的: 在这方面,我们有两个问题: 由于AzureB2C不允许将多个资源的作用域添加到一个访问令牌中,我们必须获得多个访问令牌。 我们现在处于这样一个阶段,用户界面需要调用两个或更多的API来在一个页面上显示数据。 我

  • 面向服务的体系结构(英文:Service Oriented Architecture)是一种设计模式。 它旨在通过协议为其他应用程序提供服务。 它只是一个概念,不依赖于任何编程语言或平台。 Web services差不多是SOA的一种技术。 服务 服务是定义明确的自包含功能,代表功能单元。 服务可以从另一个服务交换信息。 它不依赖于另一个服务的状态。 服务连接 下图给出了面向服务的体系结构。 服务

  • 帮助用户解决关于认证源、域、组、用户、项目、角色、权限等方面的问题。 认证服务包含哪些内容? 主要包括认证源、域、组、用户、项目、角色、权限等方面内容。 如何调整域配额和项目配额? 调整域配额 若用户是系统管理员,可直接在管理后台-系统配置-域中调整配额大小。 若用户是域管理员,若平台启用域配额申请工单流程后,可在控制面板处申请调整域配额大小,等待工单审批通过后,域配额将自动调整。 调整项目配额: