0

ComposeActivityGmail을 사용하여 전자 메일을 보내려고합니다. 나는 3 가지 방법을 시도했다. 첫번째는 간단한 Intent.setClassName이다전자 메일을 보내려고하면 ActivityNotFoundException 또는 PermissionDenial이 발생합니다.

java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.VIEW [email protected] cmp=com.google.android.gm/.ComposeActivityGmail (has extras) } from ProcessRecord{30a898b6 10871:org.madebyalex.myperiod/u0a255} (pid=10871, uid=10255) not exported from uid 10067 
    at android.os.Parcel.readException(Parcel.java:1546) 
    at android.os.Parcel.readException(Parcel.java:1499) 
    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2468) 
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1563) 
    at android.app.Activity.startActivityForResult(Activity.java:3755) 
    at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:77) 
    at android.app.Activity.startActivityForResult(Activity.java:3716) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) 
    at android.app.Activity.startActivity(Activity.java:4036) 
    at android.app.Activity.startActivity(Activity.java:3998) 
    at org.madebyalex.myperiod.EmailMessage.sendMessage(EmailMessage.java:93) 
    at org.madebyalex.myperiod.SecurityFragment$2.onClick(SecurityFragment.java:159) 
    at android.view.View.performClick(View.java:4785) 
    at android.view.View$PerformClick.run(View.java:19884) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5343) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

번째 방법은 this question에 기반 패키지 매니저를 사용 : 이에

Intent sendIntent = new Intent(Intent.ACTION_VIEW); 
    sendIntent.setType("plain/text"); 
    sendIntent.setData(Uri.parse(receivers.get(0))); 

    final PackageManager packageManager = context.getPackageManager(); 
    final List<ResolveInfo> matches = packageManager.queryIntentActivities(sendIntent, 0); 
    String className = ""; 

    for(ResolveInfo info : matches){ 
     if(info.activityInfo.packageName.equals("com.google.android.gm")){ 
      className = info.activityInfo.name; 
      if(className != null && !className.isEmpty()){ 
       break; 
      } 
     } 
    } 

    sendIntent.setClassName("com.google.android.gm", className); 
    Log.e("ERROR", "CLASS NAME: "+className); 

    sendIntent.putExtra(Intent.EXTRA_SUBJECT, getSubject()); 
    sendIntent.putExtra(Intent.EXTRA_TEXT, message+"\n"); 
    context.startActivity(sendIntent); 

이에

sendIntent.setComponent(new ComponentName("com.google.android.gm", "ComposeActivityGmail")); 

I는 다음의 예외를 가지고 다음과 같은 예외가 발생합니다 :

android.content.ActivityNotFoundException: Unable to find explicit activity class {com.google.android.gm/ComposeActivityGmail}; have you declared this activity in your AndroidManifest.xml? 
    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1868) 
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1568) 
    at android.app.Activity.startActivityForResult(Activity.java:3755) 
    at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:77) 
    at android.app.Activity.startActivityForResult(Activity.java:3716) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) 
    at android.app.Activity.startActivity(Activity.java:4036) 
    at android.app.Activity.startActivity(Activity.java:3998) 
    at org.madebyalex.myperiod.EmailMessage.sendMessage(EmailMessage.java:93) 
    at org.madebyalex.myperiod.SecurityFragment$2.onClick(SecurityFragment.java:159) 
    at android.view.View.performClick(View.java:4785) 
    at android.view.View$PerformClick.run(View.java:19884) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5343) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 

그리고 바로 그 위의 예외가 발생이 코드를 사용하여 : SO에

sendIntent.setComponent(new ComponentName("com.google.android.gm", "ComposeActivityGmail")); 

일부 답변은 안드로이드 매니페스트에이 활동을 선언했다. 은 "android.gm/ComposeActivityGmail"부분이 안드로이드 스튜디오를 불평 수행 : AndroidManifest.xml에 안드로이드 스튜디오에서이 간단한 코드를 삽입

<activity 
    android:name="com.google.android.gm/ComposeActivityGmail" 
    android:screenOrientation="locked" 
    android:exported="true"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW"/> 
    </intent-filter> 
</activity> 

은 불평 : 해결되지 않은 클래스입니다.

<activity android:name=".ComposeActivityGmail"/> 

이러한 모든 솔루션이 실패하면 어떻게 해결할 수 있습니까?

+0

이 문제를 해결 했습니까? – Nivedh

+0

@Nivedh 예. 그러나 제안 된 솔루션을 사용하지 않았습니다. 나는 Intent.createChooser를 사용했다 – learner

+0

그래서 선택자가 올 것인가? 직접 Gmail에 직접 연결되는 것은 아닙니다. – Nivedh

답변

0

android.content.ActivityNotFoundException : 명시 적 활동 클래스를 찾을 수 없습니다. {com.google.android.gm/ComposeActivityGmail}; AndroidManifest.xml에서이 활동을 신고하셨습니까?

매니페스트에서 활동을 선언하고이 시도이

<manifest xlmns:android...> 
... 
<uses-permission android:name="android.permission.INTERNET" /> 
<application ... 

<activity android:name=".ComposeActivityGmail"/> 

</manifest> 
+0

이 클래스는 해결되지 않았습니다. 나는 이것을 추가하는 것을 잊었다. – learner

0

처럼, 인터넷 권한을 추가합니다. 그것은 나를 위해 작동합니다.

Intent emailIntent = new Intent(Intent.ACTION_SEND); 
     emailIntent.setType("text/html"); 
     emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { Constants.CONTACT_EMAIL_ADDRESS }); 
     final PackageManager pm = this.getPackageManager(); 
     final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0); 
     String className = null; 
     for (final ResolveInfo info : matches) { 
      if (info.activityInfo.packageName.equals("com.google.android.gm")) { 
       className = info.activityInfo.name; 

       if(className != null && !className.isEmpty()){ 
        break; 
       } 
      } 
     } 

     emailIntent.setClassName("com.google.android.gm", className); 

     try { 
      startActivity(emailIntent); 
     } catch(ActivityNotFoundException ex) { 
      // handle error 
     } 
+0

이 코드는 내가 보여준 코드를 약간 수정 한 것입니다. – learner

+0

나는 너와 같은 예외를 받고 있었고 내 발췌 문장을 사용하면 효과가 있었다. 위에 표시된 스 니펫을 시도한 다음 작동하지 않는다면 친절하게 언급하십시오. – proy31

0

gmail을 새로 업데이트 한 후 google이 작성 활동 이름을 변경했습니다. 따라서 정적 값을주는 대신 아래 코드를 사용하여 문제를 해결하십시오.

Intent emailIntent = new Intent(Intent.ACTION_SEND); 
     emailIntent.setType("text/html"); 
     final PackageManager pm = this.getPackageManager(); 
     final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0); 
     String className = null; 
     for (final ResolveInfo info : matches) { 
      if (info.activityInfo.packageName.equals("com.google.android.gm")) { 
       className = info.activityInfo.name; 

       if(className != null && !className.isEmpty()){ 
        break; 
       } 
      } 
     } 
     emailIntent.setClassName("com.google.android.gm", className); 
관련 문제