2012-02-25 16 views
10

Başlatma modunu "singleInstance" durumuna getirdiğimde MYApp'te e-postayı açarken sorun yaşıyorum.İzin Alma hatası java.lang.SecurityException: E-posta eki adı alırken 3.x Android cihazlarda İzin Reddi

E-posta eklentisinden dosya adını okuyan ve ekranda görüntüleyen örnek Android projesini ekledim. OnCreate durumunda iyi çalışır, ancak uygulamalar başlatma modu singleInstance olduğunda onNewIntent'de hata atar.

Launchmode.java

package your.namespace.launchmode; 


public class LaunchModeActivity extends Activity { 
    private static final int OPEN_ACT = 2; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    String name = getAttachmetName(getIntent()); 
    if(null != name) 
    { 
     TextView textv = (TextView) findViewById(R.id.attachmentnm); 
     textv.setText(name); 
    } 
} 

@Override 
protected void onNewIntent(Intent savedInstanceState) 
{ 
    super.onNewIntent(savedInstanceState); 
    String name = getAttachmetName(savedInstanceState); 
    if(null != name) 
    { 
     TextView textv = (TextView) findViewById(R.id.attachmentnm); 
     textv.setText(name); 
    } 
} 


private String getAttachmetName(Intent intent) { 
    final Uri documentUri = intent.getData(); 
    if(null != documentUri){ 
    final String uriString = documentUri.toString(); 
    String documentFilename = null; 


    final int mailIndexPos = uriString.lastIndexOf("/attachments"); 
    if (mailIndexPos != -1) { 
     final Uri curi = documentUri; 
     final String [] projection = new String[] {OpenableColumns.DISPLAY_NAME}; 
     final Cursor cursor = getApplicationContext().getContentResolver().query(curi, projection, null, null, null); 
     if (cursor != null) { 
      final int attIdx = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); 
      if (attIdx != -1) { 
       cursor.moveToFirst(); 
       documentFilename = cursor.getString(attIdx);     
      } 
      cursor.close(); 
     } 
    } 
    return documentFilename; 
    } 
    return null; 
} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

    if((resultCode == RESULT_OK) && (requestCode == OPEN_ACT)) 
    { 
     Log.d("LaunchMode", "Second activity returned"); 
    } 
} 

}

AndroidManifest

<?xml version="1.0" encoding="UTF-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="your.namespace.launchmode" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-permission android:name="com.google.android.gm.permission.READ_GMAIL"/> 
    <uses-permission android:name="com.google.android.gm.permission.WRITE_GMAIL"/> 
    <uses-permission android:name="com.google.android.providers.gmail.permission.READ_GMAIL"/> 
    <uses-permission android:name="com.google.android.providers.gmail.permission.WRITE_GMAIL"/> 
    <uses-sdk android:minSdkVersion="8" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:label="@string/app_name" 
      android:launchMode="singleInstance" 
      android:name=".LaunchModeActivity" > 
      <intent-filter > 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <intent-filter > 
       <action android:name="android.intent.action.VIEW" /> 

       <category android:name="android.intent.category.DEFAULT" /> 
       <!-- docx --> 
       <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> 
       <!-- xlsx --> 
       <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /> 
       <!-- pptx --> 
       <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" /> 
       <data android:mimeType="application/vnd.ms-excel" /> 
       <data android:mimeType="application/msword" /> 
       <data android:mimeType="application/vnd.ms-powerpoint" /> 
       <data android:mimeType="text/plain" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

Yeniden oluşturma adımları 1) cihaz APK takın. 2) Cihazda gmail yerel uygulamasına gidin, görüntülemek için herhangi bir eki (ofis belgesi) açın. 3) Eylemi tamamlamak için LaunchMode uygulamasını seçin. 4) LaunchMode uygulaması ekranda dosya adını görüntüler.

Bu ilk defa (onCreate akış) ancak bu uygulama arka planda anahtar ve yine 2,3,4 adımları deneyin zaman .. hata ile uygulama çöker

E/DatabaseUtils(30615): java.lang.SecurityException: Permission Denial: reading com.google.android.gm.provider.MailProvider uri content://gmail-ls/[email protected]/messages/5/attachments/0.2/BEST/false from pid=32657, uid=10058 requires com.google.android.gm.permission.READ_GMAIL 
E/DatabaseUtils(30615):  at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:309) 
E/DatabaseUtils(30615):  at android.content.ContentProvider$Transport.bulkQuery(ContentProvider.java:178) 
E/DatabaseUtils(30615):  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:111) 
E/DatabaseUtils(30615):  at android.os.Binder.execTransact(Binder.java:339) 
E/DatabaseUtils(30615):  at dalvik.system.NativeStart.run(Native Method) 
D/AndroidRuntime(32657): Shutting down VM 

Bunu düzeltmek gerekir için çalışıyor tek bir Uygulama örneğim olması ve e-posta eki adı almam gerekir. Lütfen bana bir şey özlediğimde izin verin. 1) 2.x telefonlar 2) Tek üst fırlatma moduyla ince Works ince çalışır: o onCreate akışında çalışmak ve onu alışkanlık onNewIntent

Not durumunda işe neden burada

Sorum şu. 3) Gmail uygulamasında bazı güncellemeler. link here:

cevap

5

Büyük olasılıkla kastı da aldığınızda dosya adını okumak için bir URI izni var ve istenen izinleri (READ_GMAIL ve WRITE_GMAIL) kullanmıyorsunuz. URI izni yalnızca uygulamanız finish() es'e kadar geçerlidir, böylece devam ettirmeye çalıştığınızda buna sahip olmayacaksınız.

Bu, sizin deneyimlerinizle tutarlı - niyet, taze olduğunda değil eskidir. Ben WRITE_GMAIL bir imza izni olduğunu düşünüyorum ve ben de READ_GMAIL olduğunu tahmin ediyorum. Bu durumda yapabileceğiniz fazla bir şey yok. READ_ATTACHMENT talep etmeniz için daha uygun bir izin olabilir. URI izinlere

Daha: http://developer.android.com/guide/topics/security/permissions.html#uri

deneyin Manifest'inizde gelen uses-permission etiketlerini çıkarmadan ve aynı deneyimi olup olmadığını görün. Ayrıca, bayraklarını kontrol ederek aldığınızda intent'u da inceleyebilirsiniz.

checkCallingOrSelfUriPermission(documentUri , Intent.FLAG_GRANT_READ_URI_PERMISSION) 

0 döndürdiyseniz, URI izinlerini kullanıyorsunuz demektir.

0

Skoke, izninizi veren niyetin yeni olmadığı, yani orijinal etkinlik amacı olması gerektiği için GMail'den artık okuyamayacağınızı söyledi.Amacınız onNewIntent ise, muhtemelen başarılı olmaz.

Çözümüm güzel değil ama çalışıyor gibi görünüyor. Benim onResume'umda Gmail içeriğine erişip erişemeyeceğimi görmek için özel bir işlev aradım. Değilse, kullanıcıya bir mesaj gösterdim ve uygulamayı kapatıp tekrar denemelerini istedim. Hey, en azından çökmez.